Các kiểu dữ liệu cơ bản trong MySQL 2.. Các lệnh thông dụng trong MySQL 3.. Các kiểu dữ liệu cơ bản trong MySQLcharlength tối đa 255 ký tự, chiều dài cố định = length varcharlength tối đ
Trang 1Kết nối PHP với MySQL
Ths Lương Trần Hy Hiến, khoa CNTT, ĐH Sư phạm TpHCM
Trang 2Nội dung
1 Các kiểu dữ liệu cơ bản trong MySQL
2 Các lệnh thông dụng trong MySQL
3 Kết nối MySQL từ PHP
4 Quy trình kết nối vào MySQL
5 Các bước truy cập CSDL MySQL
2
Trang 31 Các kiểu dữ liệu cơ bản trong MySQL
char(length) tối đa 255 ký tự, chiều dài cố định = length
varchar(length) tối đa 255 ký tự, chiều dài động <= length
text tối đa 65536 ký tự
int(length) -2.147.483.648 đến +2.147.483.647
tối đa length chữ số trong đó dec chữ số
Trang 5Kiểu Mô tả
CREATE tạo CSDL hoặc bảng
ALTER thay đổi bảng có sẵn
SELECT chọn dữ liệu từ bảng
DELETE xóa dữ liệu khỏi bảng
DESCRIBE xem thông tin mô tả về cấu trúc bảng INSERT INTO ghi giá trị vào bảng
2 Các lệnh thông dụng trong MySQL
Trang 62 Các lệnh thông dụng trong MySQL
CREATE INDEX indexname ON tablename (column [ASC|DESC], ); CREATE PROCEDURE procedurename( [parameters] ) BEGIN END;
CREATE TABLE tablename
(
column datatype [NULL|NOT NULL] [CONSTRAINTS],
column datatype [NULL|NOT NULL] [CONSTRAINTS],
Trang 72 Các lệnh thông dụng trong MySQL
ALTER TABLE tablename
Trang 92 Các lệnh thông dụng trong MySQL
VD:
‘K29.103.010’
Trang 102 Các lệnh thông dụng trong MySQL
INSERT INTO tablename [(columns, )]
Trang 112 Các lệnh thông dụng trong MySQL
Trang 122 Các lệnh thông dụng trong MySQL
DROP DATABASE | INDEX | PROCEDURE |
TABLE | TRIGGER | USER | VIEW itemname;
VD:
• Xóa bảng SINHVIEN: DROP TABLE SinhVien
• Xóa CSDL QLSV: DROP DATABASE QLSV;
Trang 13Giao tiếp dòng lệnh
• Kết nối mysql server
mysql [-h hostname] [-P portnumber] -u username -p
mysql [-h hostname] [-P portnumber] user=user
password=pass
Nhập lệnh sau dấu nhắc lệnh mysql >
Mỗi lệnh SQL kết thúc bằng dấu ;
Trang 153 Kết nối MySQL từ PHP
PHP scriptmysql mysqli
Trang 16Thư viện mysql cải tiến trong PHP5
• Thiết lập trong php.ini
extension=php_mysqli.dll
• Ưu điểm
– Hỗ trợ lập trình hướng đối tượng
– Hỗ trợ nhân bản và phân tán CSDL
– Nén và mã hóa dữ liệu trên kết nối
– Tối ưu hiệu năng và mã
• Nhược điểm
– Chỉ làm việc với CSDL MySQL
Trang 174 Quy trình kết nối vào MySQL
Trang 18Bước 1: Mở kết nối đến CSDL
// OOP mysqli
$mysqli = new mysqli ('hostname',
'username', 'password', 'dbname');
// mysqli
$link = mysqli_connect ('hostname',
'username', 'password', 'dbname');
Trang 20mysqli_query($link, "SET NAMES ‘character set’")
VD: SET NAMES UTF8
Trang 22$row = mysqli_fetch_row($result)
$row = mysqli_fetch_assoc($result)
$row = mysqli_fetch_array($result, result_type)
Trang 255 Các bước truy cập CSDL MySQL
1 Tạo kết nối đến database server
2 Lựa chọn CSDL
3 Xây dựng truy vấn và thực hiện truy vấn
4 Xử lý kết quả trả về
5 Đóng kết nối đến server
Trang 26Khai báo sử dụng CSDL MySQL
•Khai báo kết nối CSDL:
<? php
$dbhost = ‘localhost’;
$dbuser = 'root';
$dbpass = 'password';
$conn = mysqli_connect ($dbhost, $dbuser,
$dbpass) or die (Không thể kết nối CSDL
Trang 27Khai báo sử dụng CSDL MySQL (tt)
• Truy vấn dữ liệu:
$result = mysqli_query (‘câu_truy_vấn’);
• Giải phóng tài nguyên truy vấn
Trang 29P HP D ata O bjects
Trang 30PDO (PHP Data Object)
• Ưu điểm:
– Áp dụng từ PHP 5.0 (tích hợp sẵn trong PHP 5.1)
– Cung cấp giao tiếp hướng đối tượng
– Cung cấp một giao tiếp nhất quán cho phép lưu chuyển dữ liệu giữa các hệ cơ sở dữ liệu khác nhau như Oracle, DB2, Microsoft SQL Server, PostgreSQL
• Nhược điểm:
– Không làm việc trên PHP phiên bản < 5.0.
– Không tận dụng ưu điểm của các tính năng tiên tiến mới của MySQL phiên bản 4.1.3 trở lên, như tính năng lồng câu lệnh SQL.
30
Trang 31Kết nối CSDL PDO
try {
$dbh = new PDO ($dsn ,
$user , $password , $options );
} catch (PDOException $e) {
echo “Failed to connect:”
$e->getMessage();
Trang 33Quản lý kết nối
try {
$dbh = new PDO($dsn, $user, $pw);
} catch (PDOException $e) {
echo “connect failed:” $e->getMessage();
Trang 35Các kiểu duyệt (fetch type)
Trang 36“ UPDATE HangHoa SET active=1 ”
“WHERE NAME LIKE ‘ %coke% ’”);
Trang 37Prepared Statements
• Quoting is annoying, but essential
• PDO offers a better way
$stmt->prepare(‘INSERT INTO Account (email,
fullname) VALUES (:email, :fullname)’);
$stmt->execute(array(
‘:email’ => ‘teo.tran@gmail.com’,
‘:fullname’ => ‘Trần Văn Tèo’
Trang 38Prepared Statements
$stmt->prepare(‘INSERT INTO Account (email, fullname) VALUES (:email, :fullname)’);
$stmt->bindParam(':fullname', $fullname);
$stmt->bindParam(':email', $email);
Trang 39Binding for output
$stmt = $dbh->prepare(
"SELECT extension, name from CREDITS");
if ($stmt->execute()) {
$stmt->bindColumn(‘extension', $extension);
$stmt->bindColumn(‘name', $name);
while ($stmt->fetch(PDO_FETCH_BOUND)) {
echo “Extension: $extension\n”;
echo “Author: $name\n”;
Trang 41Get ID of The Last Inserted Record
• $sql = "INSERT INTO Account (fullname, email) VALUES ('John Doe', 'john@exam.com')";
Trang 42Insert Multiple (1/2) - mysqli
• $sql = "INSERT INTO Account (fullname, email)VALUES ('John Doe', 'john@example.com');";
$sql = "INSERT INTO Account (fullname, email)VALUES ('Mary Moe', 'mary@example.com');";
$sql = "INSERT INTO Account (fullname, email) VALUES ('Julie Dooley', 'julie@example.com')";
• if ($conn->multi_query($sql) === TRUE)
echo "New records created successfully";
• if (mysqli_multi_query($conn, $sql))
echo "New records created successfully"; 42
Trang 43Insert Multiple (2/2) - PDO
• // begin the transaction
$conn->beginTransaction();
• // our SQL statememtns
$conn->exec("INSERT INTO Account (fullname,
email) VALUES ('John Doe', 'john@exam.com')");
$conn->exec("INSERT INTO Account (fullname,
email) VALUES ('Mary Moe', 'mary@exam.com')");
$conn->exec("INSERT INTO Account (fullname,
email) VALUES ('Julie Dooley', 'julie@exam.com')");
Trang 44Kiểm tra hợp lệ trên Server
$data = preg_match (“/[^A-Z]/”, $value);
if (!$data) alert (“valid”);
else alert (“invalid”);
}
Trang 45Validating data:
/ r / defines a specific character / / matches any single character / \ / matches dot (nokta)
[ 0-9 ] matches a named range of
characters
[ ^a-z ] NOT small letters
Character classes:
Trang 46{n, m} repeats between n and m times
{n,} repeats at least n times (n or more) ( ) grouping (like math)
Trang 47Nguy cơ đối với người dùng cuối
Trang 48SQL Injection
48
Trang 49SQL Injection
• Là một kỹ thuật cho phép những kẻ tấn công thi hành các câu lệnh truy vấn SQL bất hợp
pháp.
• Bằng cách lợi dụng lỗ hổng trong việc kiểm tra
dữ liệu nhập trong các ứng dụng web.
Trang 50SELECT * FROM LOGIN WHERE username=‘hien’
AND password=‘123’;
Trang 51An SQL injection attack: input modifies query Changes from secure to insecure
SELECT * FROM LOGIN WHERE username=$_POST[‘Username’] AND password=$_POST[‘Password’];
Trang 52Captures all data on the table
“OR 1” clause is always true
SELECT * FROM LOGIN WHERE username=$_POST[‘Username’] AND password=$_POST[‘Password’];
Trang 53Captures all data in table
X always equals X; entire table in recordset
If username AND password on same table…
SELECT * FROM LOGIN WHERE username=$_POST[‘Username’]
Trang 54Attacking a number field (won’t work in example)
One always equals one (all fields returned)
SELECT * FROM LOGIN WHERE age=$_POST[‘age’];
Trang 55SQL injection attacks:
‘mysqli_query’: one query per command
$query1 = mysqli_query (“INSERT INTO tbluser VALUES (‘’,
‘$_POST[Username]’, ‘$_POST[LastName]’,
‘$_POST[FirstName]’)” );
Trang 56SELECT * FROM LOGIN WHERE Username=$_POST[‘Username’];
x'; INSERT INTO members (‘User’, ‘pass’,
‘FirstName’, ‘LastName’) VALUES (‘test01’,‘smelly’‘Steve’,‘Johnson’);
Trang 57SQL injection attacks:
Delete/create a new table
Username
SELECT * FROM LOGIN WHERE Username=$_POST[‘Username’];
SELECT * FROM LOGIN WHERE Username=‘Me’; DROP table Order;
x’; DROP table tblorder; x’; CREATE TABLE steve (id INT(5), name VARCHAR(15));
Trang 59Ví dụ
Trang 60Q & A
Trang 61THE END