1. Tổng quan về việc kết nối PHP với MySQL(Connect)

Kết nối PHP và MySQL là bước cơ bản khi bạn muốn làm bất kỳ thao tác gì liên quan đến MySQL. Từ phiên bản PHP 5.5 trở đi, thư viện MySQL sẽ không còn được hỗ trợ, và phiên bản PHP 7 trở lên đã gỡ bỏ hoàn toàn thư viện MySQL, thay vào đó 2 thư viện khác được sử dụng là MySQLi và PDO.

Từ PHP 5 trở lên có thể hoạt động với cơ sở dữ liệu MySQL bằng cách sử dụng:

  • Tiện ích mở rộng MySQLi (“i” là viết tắt của cải tiến)
  • PDO (Đối tượng dữ liệu PHP)

MySQLi viết tắt của MySQL Improved, nó thêm tính năng trong giao diện của MySQL database. MySQLi có tính procedural và object-oriented(thủ tục và đối tượng), yếu tố đầu tiên để dùng cho phiên bản cũ hơn của MySQL. MySQL gốc chia tác vụ theo tuyến tính, từng bước một, khiến việc điều chỉnh khó khăn vì bạn phải sửa code từ trên cùng. Trong khi đó, MySQLi xem dữ liệu như là một bộ các đối tượng với functions, cho phép user thêm hoặc xóa dữ liệu dễ dàng.

PDO viết tắt của cụm PHP Data Object. Khác biệt chính giữa PDO và MySQLi là PDO hỗ trợ nhiều loại database khác nhau (MySQL, MS SQL, Postgres DB) trong cùng một script, bạn chỉ cần viết các hàm liên quan đến dữ liệu một lần. PDO là ‘object oriented’ (hướng đối tượng), kết nối giữa website và database được tạo bởi các biến đối tượng.

Rồi bây giờ một câu hỏi đặt ra là ta sẽ sử dụng MySQLi hay PDO? Thực ra thì rất đơn giản là bạn thích làm việc với cái gì thì bạn làm thôi! Vì cả MySQLi hay PDO cái nào cũng có điểm mạnh, điểm yếu riêng của mình cả thôi. Tuy nhiên người ta vẫn có những đánh giá nhất định cho từng cái để cho bạn lựa chọn:

  • Đầu tiên với MySQLi thì chỉ có thể kết nối và xử lý với MySQL, còn PDO có thể kết nối với 12 hệ quản trị CSDL khác nhau. Như vậy nếu ứng dụng của bạn có kết nối với nhiều hệ quản trị CSDL thì bạn nên sử dụng PDO, còn chỉ một mình MySQL thôi thì có thể chọn MySQLi.
  • Tiếp theo là giả sử nếu dự án của bạn đang viết ở MySQL, nhưng một ngày nào đó bạn chuyển toàn bộ data sang SQL Server thì lúc này PDO lại có lợi thế hơn bởi vì bạn chỉ cần thay chuỗi kết nối là được. Nhưng với MySQLi thì bạn sẽ phải viết lại toàn bộ dự án.
  • Cả hai thư viện đều hỗ trợ Prepared Statements, đây là vấn đề quan trọng để tránh lỗi SQL Injection. Cả hai thư viện cũng đều hỗ trợ object-oriented (hướng đối tượng), nhưng đối với MySQLi thì hỗ trợ thêm các hàm thủ tục (Procedural).

Dựa vào những đánh giá này thì các bạn có thể tha hồ đắn đo lựa chọn nhé!

2. Những thông số cần biết trước khi kết nối PHP với MySQL

Để cho quá trình kết nối của bạn được diễn ra một cách đơn giản và nhanh chóng nhất. Bạn sẽ cần chuẩn bị những kiến thức và tài liệu sẵn. Để cho tới khi bước vào thực hành bạn chỉ cần nhập số liệu thôi. Chứ không cần tìm lại từng trường để điền vào các ô nữa. Phần này có thể giúp ích cho các bạn đó!

2.1. Những thông số quan trọng

Dưới đây mình sẽ nói lại về những thông số cực kỳ quan trọng mà các bạn cần phải nhớ. Nếu như các bạn đã đọc bài trước thì mình cũng đã giới thiệu qua rồi:

  • Hostname: Đây là server của MySQL. Với phần này, bạn sẽ để mặc định là localhost nhé
  • Databasename: Tên database mà bạn muốn kết nối
  • Username: Tên để bạn truy cập Database. Ở trường này bạn sẽ để mặc định là Root.
  • Password: Chắc chắn đây là thuật ngữ vô cùng đơn giản và gần gũi với các bạn rồi. Mật khẩu này bạn sẽ để theo ý muốn của các bạn nhé.

2.2. Một số hàm cơ bản

Kiểu thủ tục
(Proceducal)
Kiểu hướng đối tượng
(Object-Oriented)
Ý nghĩa
$ketnoi = mysqli_connect() $ketnoi = new mysqli() Tạo kết nối database
mysqli_connect_error() $ketnoi->connect_error Lỗi kết nối
mysqli_close($ketnoi) $ketnoi->close() Ngắt kết nối MySQLi
$ketqua = mysqli_query($ketnoi, $sql) $ketqua = $ketnoi->query($sql) Truy vấn table từ $ketnoi

Với $sql là câu truy vấn select

mysqli_num_rows($ketqua) $ketqua->num_rows Số lượng số hàng có trong table.
mysqli_fetch_assoc($ketqua) $ketqua->fetch_assoc() Số lượng số hàng có trong table.

3. Kết nối PHP với MySQL bằng mysqli

3.1. Mysqli hướng thủ tục

Để kết nối PHP với MySql bằng phương thức này thì chúng ta dùng hàm mysqli_connect() với cú pháp như sau:

mysqli_connect(hostame, username, password, databasename);

Ví dụ:

//khai báo biến host
$hostName = 'localhost';
// khai báo biến username
$userName = 'root';
//khai báo biến password
$passWord = '';
// khai báo biến databaseName
$databaseName = 'db_lttd';
// khởi tạo kết nối
$connect = mysqli_connect($hostName, $userName, $passWord, $databaseName);
//Kiểm tra kết nối
if (!$connect) {
    exit('Kết nối không thành công!');
}
// thành công
echo 'Kết nối thành công!';

3.2. Mysqli hướng đối tượng

Đối với phương thức này các bạn chỉ cần khởi tạo class mysqli với cú pháp như sau:

new mysqli(hostname, username, password, databasename, port, socket);

Ví dụ:

//khai báo biến host
$hostName = 'localhost';
// khai báo biến username
$userName = 'root';
//khai báo biến password
$passWord = '';
// khai báo biến databaseName
$databaseName = 'db_lttd';
// khởi tạo kết nối
$connect = new mysqli($hostName, $userName, $passWord, $databaseName);
//Kiểm tra kết nối
if ($connect->connect_error) {
    exit('Kết nối không thành công. chi tiết lỗi:' . $connect->connect_error);
}
// thành công
echo 'Kết nối thành công!';

Lưu ý

Các phiên bản MySQL trước Version 5.3 sẽ phải sử dụng đoạn code sau để kiểm tra kết nối thành công hay thất bại:

if (mysqli_connect_error()) {
    die("Kết nối thất bại: " . mysqli_connect_error());
}

Mình sẽ giải thích ví dụ của cả 2 phần luôn nhé

  • Đầu tiên là phần khai báo các biến và các giá trị tương ứng của chúng. Các giá trị này phải tương ứng với chi tiết kết nối của ta.
  • Tiếp theo là hàm chính của PHP mysqli_connect(). Nó thiết lập một kết nối với database được chỉ định.
  • Sau đây là câu lệnh “if”. Đây là một phần của code cho biết liệu kết nối đã được thiết lập hay chưa. Khi kết nối không thành công, nó sẽ đưa ra thông báo “kết nối không thành công”. Hàm exit sẽ in thông báo và sau đó thoát ra khỏi script.
  • Nếu kết nối thành công thì nó sẽ hiển thị “kết nối thành công”.

4. Kết nối MySQL với PHP bằng PDO

Để kết nối PHP với MySql bằng PDO các bạn chỉ cần khởi tạo class PDO với cú pháp:

new PDO(dsn, username, password, option);

Trong đó: dsn chứa các thông tin như database drive, hostname, databasename còn option chứa các thông số tùy chỉnh(mình sẽ nói sau).

Ví dụ:

//khai báo biến host
$hostName = 'localhost';
// khai báo biến username
$userName = 'root';
//khai báo biến password
$passWord = '';
// khai báo biến databaseName
$databaseName = 'db_lttd';
// khởi tạo kết nối
try {
    $connect = new PDO('mysql:host=' . $hostName . ';dbname=' . $databaseName, $userName, $passWord);
    $connect->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    //thành công
    echo 'thành công';
} catch (PDOException $e) {
    //thất bại
    die($e->getMessage());
}

Giải thích:

  • Đầu tiên vẫn là việc khai báo các biến và giá trị tương ứng của nó. Nhớ là các giá trị này phải tương ứng với chi tiết kết nối của bạn.
  • Server name sẽ là localhost. Nếu được kết nối với một server online, hãy nhập tên server đó vào server name.
  • Lớp ngoại lệ try catch dùng để xử lý việc xử lý thành công hay không. Đây là tài sản lớn của PDO là một lớp ngoại lệ để xử lý mọi vấn đề tiểm ẩn trong các truy vấn database. Nó giải quyết những vấn đề này bằng try và catch.

5. Đóng kết nối

Kết nối sẽ tự động đóng khi tập lệnh kết thúc. Để đóng kết nối trước đó, hãy sử dụng như sau:

Hướng đối tượng MySQLi: $conn->close();

Thủ tục MySQLi: mysqli_close($conn);

PDO: $conn = null;

6. Các lỗi tiềm ẩn khi kết nối MySQL với PHP bằng MySQLi và PDO

6.1. Password không đúng

Password trong PHP code cần phải tương ứng với password trong database. Nếu cả hai không khớp, kết nối với database không thể được thiếp lập. Bạn sẽ nhận được thông báo lỗi cho biết kết nối không thành công.

Phương pháp xử lý khả thi:

  • Kiểm tra chi tiết database để đảm bảo password chính xác.
  • Đảm bảo người dùng được chỉ định cho database

6.2. Không thể kết nối MySQL Server

PHP có thể không kết nối được với MySQL server nếu tên server không được nhận dạng. Đảm bảo rằng tên server được đặt thành localhost. Trong trường hợp xảy ra lỗi khác, hãy nhớ thêm file “error_log” để trợ giúp khi cố gắng giải quyết bất kỳ vấn đề nào. File nằm trong cùng một folder nơi script đang chạy.