PHP và Database

PHP và Database quan hệ rất chặt chẽ. PHP xử lý dữ liệu còn database là kho lưu trữ, Từ PHP có thể dùng MySQLI /PDO để tương tác với database.


PHP và Database

Kết nối đến database là hoạt động luôn thực hiện trong lập trình php, trong mọi website. Vì database là kho dữ liệu, nơi lưu trữ dữ liệu. PHP kết nối đến để lấy dữ liệu, để thêm dữ liệu, chỉnh sửa, xóa dữ liệu trong database.

Từ PHP, bạn có thể kết nối đến Mysql bằng 2 cách: một là dùng thư viện mysqli hai là dùng PDO. Cả hai thư viện này đều có sẵn trong php, bạn muốn dùng cái nào cũng được. Mysqli nhanh hơn nhưng PDO có nhiều đặc điểm tăng cường giúp an toàn hơn, PDO cũng giúp kết nối đến nhiều loại database hơn.

Sử dụng mysqli để tương tác với mysql

1. Tạo connection đến database dùng mysqli

Tạo connection đến database là việc đầu tiên cần làm trước khi muốn lấy dữ liệu hoặc thêm sửa xóa dữ liệu trong database. Cú pháp như sau:

$connection = new mysqli( $host, $username, $password, $ddname, $port);

Các thông số để kết nối bao gồm :

  • $host – địa chi của server mysql
  • $username – tên truy cập đến mysql
  • $password – mật khẩu kết nối,
  • $dbname – tên database muốn kết nối và
  • $port – cổng kết nối (mặc định là 3306);

2. Thực thi câu lệnh sql

Sau khi kết nối như trên, bạn sẽ có được 1 đối tượng . Trong đốii tượng này có sẵn 1 hàm là query. Chạy hàm query trong đối tượng connection để lấy dữ liệu từ mysql. Cú pháp như sau:

$result = $connection->query($sql);  

Kết quả trả về của hàm query tùy vào câu lệnh sql. Nếu câu lệnh sql là select thì kết quả là đối tượng chứa dữ liệu . Còn nếu câu lệnh sql là INSERT, UPDATE, DELETE thì kết quả là true nếu chạy ok, false nếu chạy lỗi.

3. Trích xuất từng dòng dữ liệu bằng hàm fetch

Nếu câu lệnh sql là select đúng 1 record thì hàm query trả về 1 đối tượng dữ liệu. Lúc này dùng hàm fetch_assoc để trích từng dòng dữ liệu. kết quả của hàm fetch là 1 array. Từ đây bạn hiện các phần tử trong array theo ý muốn

$row = $result->fetch_assoc();

4. Trích xuất từng dòng dữ liệu với foreach

Nếu câu lệnh sql là select nhiều record  thì hàm query trả về 1 mảng các object dữ liệu. Lúc này bạn  dùng foreach để trích từng dòng ra để xử lý.

foreach ( $result as $row ) {
    //xử lý các phần tử của $row theo yêu cầu
}

5. Ví dụ lấy dữ liệu với mysqli

  • Lấy 1 record từ database: chạy lệnh sql lấy 1 record rồi fetch_assoc để có record dữ liệu cần dùng.
<?php //testdb.php
$conn = new mysqli("localhost", "root", "", "laptop",3306);
$sql="select ten_sp, gia, ngay from sanpham where id_sp=1";
$kq = $conn->query($sql);
$row = $kq->fetch_assoc();  //[ 'ten_sp' => 'MSI LarkBook 1155G7', 'gia' => '11860407', 'ngay' => '2023-05-12']
echo $row['ten_sp']; //MSI LarkBook 1155G7
?>
  • Lấy nhiều record từ database: chạy lệnh sql lấy các record rồi dùng foreach để trích từng record dữ liệu mà xử lý.
<?php //testdb.php
   $conn = new mysqli("localhost", "root", "", "laptop",3306);
   $sql="select ten_sp, gia, ngay 
         from sanpham order by ngay desc limit 0,10";
   $kq = $conn->query($sql);
   foreach ($kq as $row){ echo "<p>" . $row['ten_sp'] . "</p>"; }
?>
  • Chạy sql là insert , kết quả trả về là true hoặc false tùy theo kết quả chạy có lỗi hay không.
<?php //testdb.php
$conn = new mysqli("localhost", "root", "", "laptop", 3306);
$sql="INSERT INTO users SET ho='Hồ', ten='Ý', matkhau='123', email='hoy@yho.com'";
$kq = $conn->query($sql); //true
?>

6. Prepared statement

MySQL hỗ trợ một thứ gọi là prepared statement. Bạn có muốn thì dùng, không dùng cũng được. Nếu có dùng thì chịu khó viết thêm vài lệnh, dài hơn nhưng an toàn hơn, giúp tránh các lỗi bảo mật SQL Injection.

Sau khi kết nối xong, dùng hàm prepare với tham số là câu lệnh sql để tạo đối tượng prepared statement (câu lệnh sql có thể chứa nhiều dấu ? đại diện). Sau đó dùng hàm bind_param trong đối tượng prepare để khai báo kiểu và các giá trị sẽ đưa vào các dấu ? . Cuối cùng dùng hàm execute trong prepare để thực thi câu lệnh sql.

<?php //testdb.php
$conn = new mysqli("localhost", "root", "", "laptop",3306);
$sql="INSERT INTO users SET ten=?, matkhau=?, email=?, vaitro=? ";
$stmt = $conn->prepare($sql);
$ten='Việt'; $mk='123';$email='viet@gmail.com'; $vaitro=1;
$stmt->bind_param('sssi', $ten, $mk, $email, $vaitro);
$stmt->execute(); 
?>

Nếu câu lệnh sql là select, sau khi thực thi sql với hàm execute xong thì dùng hàm get_result để lấy kết quả.

<?php //testdb.php
$conn = new mysqli("localhost", "root", "", "laptop",3306);

$sql="SELECT id_sp, ten_sp, gia, hinh FROM sanpham where ten_sp like ? ";
$stmt = $conn->prepare($sql);
$tukhoa='%G15%'; 
$stmt->bind_param('s', $tukhoa);
$stmt->execute(); 
$result = $stmt->get_result();

foreach($result as $row) {
    echo "<h4>". $row['ten_sp'] . "</h4>";
}
?>

Sử dụng pdo để tương tác với mysql

Giữa PHP và Database, bạn cũng có thể dùng thư viện PDO. Đây là cách thứ hai ngoài mysqli giúp bạn tương tác với mysql server.

1. Tạo connection đến database dùng PDO

Tạo connection là bước đầu tiên, trước khi thực hiện xem thêm sửa xóa dữ liệu trong database. Các thông số cần khai báo là địa chỉ server, tên database, username, password. Cú pháp tham khảo ví dụ sau:

<?php //testdb.php
$host="localhost"; $dbname="laptop"; $un ="root"; $pass="";
$conn = new PDO("mysql:host=$host; dbname=$dbname; charset=utf8", $un, $pass);
?>

Để có thể nhận được lỗi có thể xảy ra khi thực hiện kết nối, đặt lệnh trong try catch như sau.

<?php //testdb.php
try {
    $host="localhost"; $dbname="laptop"; $un ="root"; $pass="";
    $conn = new PDO("mysql:host=$host; dbname=$dbname; charset=utf8", $un, $pass);
} catch(PDOException $e){
    die("Lỗi kết nối: ". $e->getMessage());
}
?>

Nếu có lỗi , như sai username, pass, sai tên datanase, sai charcset thì dòng xử lý sẽ nhảy vào catch, còn nếu kết nối thành công thì lệnh trong catch sẽ bị bỏ qua.

2. Thực thi câu lệnh sql

Để thực thi câu lệnh sql (không có place holder0 , bạn hàm query trong đối tượng connection vừa tạo. Cú pháp như sau:

<?php
$sql = "SELECT id_sp, ten_sp FROM sanpham WHERE id_sp = 1";
$kq = $conn->query($sql);
?>

Kết quả trả về của hàm query là đối tượng chứa dữ liệu hoặc false nếu chạy lỗi.

3. Trích xuất từng dòng dữ liệu bằng hàm fetch

Nếu câu lệnh sql là select 1 record thì dùng hàm fetch  để trích record ra. kết quả của fetch là array. Từ đây bạn hiện các phần tử trong array theo ý muốn

<?php
$sql = "SELECT id_sp, ten_sp FROM sanpham WHERE id_sp=1";
$kq = $conn->query($sql);
$row = $kq->fetch(); //PDO::FETCH_ASSOC
print_r($row); //[id_sp => 1, ten_sp => MSI LarkBook 1155G7 ]
?>

4. Trích xuất từng dòng dữ liệu với vòng lặp foreach

Nếu câu lệnh sql là select nhiều record  thì hàm query trả về 1 mảng các object dữ liệu. Dùng vòng lặp foreach để trích từng dòng để xử lý là tiện nhất.

<?php
$sql="SELECT id_sp, ten_sp FROM sanpham WHERE hot=1 LIMIT 0, 10";
$arr = $conn->query($sql);
foreach($arr as $row) echo "<p> {$row['ten_sp']}  </p> ";
?>

5. Prepared statement với PDO

Với PDO, bạn cũng có thể tạo prepared statement để an toàn hơn, tránh các lỗi bảo mật SQL Injection. Chịu khó code dài hơn một chút. Còn như không muốn dùng cũng được.

Sau khi kết nối xong, dùng hàm prepare với tham số là câu lệnh sql để tạo đối tượng prepared statement (câu lệnh sql có thể chứa nhiều tên đại diện). Sau đó dùng hàm bindParam trong đối tượng prepare để khai báo giá trị và kiểu của các chuỗi đại diện. Cuối cùng dùng hàm execute trong prepare để thực thi câu lệnh sql.

Sau khi thực thi xong, có thể dùng hàm rowCount() trong statement để biết số dòng bị ảnh hưởng bởi câu lệnh (select, insert, update, delete)

Nếu câu lệnh sql là insert into thì trong đối tượng connection, bạn dùng hàm lastInsertId() để biết được id của record mới được chèn vào database (id tăng tự động).

<?php
$sql = "INSERT INTO users SET ten=:t, email=:em, vaitro=:vt ";
$stmt = $conn->prepare($sql);
$ten = "Tèo"; $email="teo@gmail.com"; $vaitro=1;
$stmt->bindParam(":t", $ten, PDO::PARAM_STR);
$stmt->bindParam(":em", $email, PDO::PARAM_STR);
$stmt->bindParam(":vt", $vaitro, PDO::PARAM_INT);
$stmt->execute();
echo "Số dòng ảnh hưởng:", $stmt->rowCount(), "<br>"; 
echo "ID của dòng mới chèn:", $conn->lastInsertId(), "<br>"; 
?>

Nếu câu lệnh sql là select, sau khi thực thi sql với hàm execute xong thì dùng hàm fetchAll để lấy kết qủa.

<?php
$sql="SELECT id_sp, ten_sp FROM sanpham WHERE ten_sp like :tukhoa LIMIT 0, :sosp";
$stmt = $conn->prepare($sql);
$tukhoa= "%Gaming%"; $sosp=10;
$stmt->bindParam(":tukhoa", $tukhoa, PDO::PARAM_STR);
$stmt->bindParam(":sosp", $sosp, PDO::PARAM_INT);
$stmt->execute();
$result = $stmt->fetchAll();
foreach($result as $row) { echo "<h4>". $row['ten_sp'] . "</h4>"; }
?>

Quan hệ giữa PHP và Database không chỉ có MySQL. PHP còn có thể kết nối đến MSSQL, Oracle, SQLite3. Chúng ta sẽ đề cập đến trong các bài khác nhé.

Nếu cần tham khảo thêm, mời bạn xem các link sau: