Mới: Bảng phím tắt Excel theo nhóm thao tác, in ra dán cạnh màn hình là dùng được.

Xem ngay
Kết nối PHP với MySQL bằng PDO: hướng dẫn từng bước
Kết nối PHP với MySQL bằng PDO: hướng dẫn từng bước

Kết nối PHP với MySQL bằng PDO: hướng dẫn từng bước

Cách kết nối PHP với MySQL bằng PDO từng bước: tạo kết nối, truy vấn có tham số, thêm sửa xoá dữ liệu và xử lý lỗi để tránh SQL injection.

Bởi Ban biên tập Asean Edu

/

5 phút đọc

/ /

Kết nối php mysql là kỹ năng nền tảng nếu bạn muốn làm trang web có lưu dữ liệu. PHP cung cấp hai cách phổ biến là MySQLi và PDO. Chúng tôi thiên về PDO vì cú pháp thống nhất và hỗ trợ câu lệnh chuẩn bị sẵn rất tiện. Bài này đi qua cách tạo kết nối, đọc dữ liệu, thêm sửa xoá và xử lý lỗi, theo từng bước bạn có thể gõ lại ngay.

Chuẩn bị cơ sở dữ liệu mẫu

Chuẩn bị cơ sở dữ liệu mẫu
Chuẩn bị cơ sở dữ liệu mẫu

Trước hết, bạn cần một cơ sở dữ liệu để thử. Mở phpMyAdmin hoặc dòng lệnh MySQL và chạy các câu sau.

Tạo cơ sở dữ liệu tên “hoc_php” với bảng “sinhvien” gồm ba cột: id kiểu số nguyên tự tăng, ten kiểu chuỗi và lop kiểu chuỗi. Thêm vài dòng dữ liệu mẫu, ví dụ “Lan” lớp “10A” và “Minh” lớp “10B”.

Nếu chưa quen với các câu lệnh tạo bảng, hãy xem bài các câu lệnh SQL cơ bản trước. Phần còn lại của bài giả định bạn đã có bảng sẵn và có tài khoản MySQL để đăng nhập.

Tạo kết nối php mysql bằng PDO

Tạo kết nối php mysql bằng PDO
Tạo kết nối php mysql bằng PDO

Kết nối được tạo bằng cách khởi tạo một đối tượng PDO với ba thông tin: chuỗi kết nối (DSN), tên người dùng và mật khẩu.

Ví dụ: $pdo = new PDO(“mysql:host=localhost;dbname=hoc_php;charset=utf8mb4”, “root”, “”);. Phần charset=utf8mb4 rất quan trọng với tiếng Việt. Nếu thiếu, chữ có dấu có thể hiển thị thành ký tự lạ.

Ngay sau đó, hãy đặt chế độ báo lỗi bằng $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);. Với dòng này, mọi lỗi cơ sở dữ liệu sẽ được ném ra dưới dạng ngoại lệ. Bạn bắt được bằng try và catch thay vì bị lỗi im lặng.

Trên máy học, tài khoản root không mật khẩu là bình thường. Khi đưa lên máy chủ thật, bạn nên tạo tài khoản riêng chỉ có quyền cần thiết và dùng mật khẩu mạnh. Không đặt thông tin kết nối trong tệp công khai mà ai cũng đọc được.

Đọc dữ liệu với truy vấn có tham số

Đọc dữ liệu với truy vấn có tham số
Đọc dữ liệu với truy vấn có tham số

Giả sử bạn muốn lấy danh sách sinh viên của một lớp do người dùng chọn. Nhiều người mới nối thẳng giá trị vào câu SQL, và đó chính là cách gây ra SQL injection.

Cách đúng là dùng câu lệnh chuẩn bị sẵn:

  • $stmt = $pdo->prepare(“SELECT id, ten FROM sinhvien WHERE lop = :lop”);
  • $stmt->execute([“:lop” => $lopDuocChon]);
  • $rows = $stmt->fetchAll(PDO::FETCH_ASSOC);

Ở đây, :lop là chỗ giữ chỗ. PDO gửi câu lệnh và giá trị đi hai đường riêng biệt. Nên dù ai đó nhập một chuỗi độc hại, nó vẫn chỉ là dữ liệu, không trở thành lệnh.

Để in kết quả, bạn dùng vòng foreach duyệt $rows. Nhớ bọc giá trị xuất ra HTML bằng htmlspecialchars để tránh người khác chèn mã vào trang của bạn.

Thêm, sửa và xoá dữ liệu

Thêm, sửa và xoá dữ liệu
Thêm, sửa và xoá dữ liệu

Ba thao tác này cùng một khuôn với lệnh đọc, chỉ khác câu SQL.

  • Thêm: prepare(“INSERT INTO sinhvien (ten, lop) VALUES (:ten, :lop)”) rồi execute với mảng giá trị. Sau đó $pdo->lastInsertId() cho biết id vừa được tạo.
  • Sửa: prepare(“UPDATE sinhvien SET lop = :lop WHERE id = :id”).
  • Xoá: prepare(“DELETE FROM sinhvien WHERE id = :id”).

Với sửa và xoá, đừng bao giờ quên mệnh đề WHERE. Thiếu WHERE sẽ cập nhật hoặc xoá toàn bộ bảng chỉ bằng một lần chạy.

Sau lệnh sửa hoặc xoá, $stmt->rowCount() trả về số dòng bị ảnh hưởng. Hãy dùng nó để báo cho người dùng biết thao tác có thật sự thay đổi gì không.

Xử lý lỗi kết nối php mysql gọn gàng

Hãy bọc toàn bộ phần làm việc với cơ sở dữ liệu trong khối try và catch. Khi bắt được PDOException, ghi nội dung lỗi vào tệp nhật ký và hiện thông báo thân thiện cho người dùng.

Đừng in thẳng $e->getMessage() ra màn hình ở môi trường thật. Thông báo lỗi có thể chứa tên máy chủ, tên bảng hay đoạn câu lệnh. Trên máy học, hiển thị lỗi giúp bạn sửa nhanh. Trên máy chủ thật, hãy tắt hiển thị và chỉ ghi nhật ký.

Với thao tác ghi nhiều bảng cùng lúc, hãy dùng giao dịch: $pdo->beginTransaction(), rồi commit() nếu mọi thứ thành công, rollBack() nếu có lỗi. Giao dịch đảm bảo dữ liệu không bị ghi dở dang.

Những lỗi kết nối php mysql hay gặp

Lỗi “could not find driver” nghĩa là PHP chưa bật phần mở rộng pdo_mysql. Mở tệp php.ini, bỏ dấu chấm phẩy trước extension=pdo_mysql rồi khởi động lại máy chủ.

Lỗi “Access denied for user” nghĩa là tên người dùng hoặc mật khẩu sai, hoặc tài khoản không có quyền với cơ sở dữ liệu đó. Lỗi “Unknown database” nghĩa là tên cơ sở dữ liệu chưa tồn tại.

Nếu chữ tiếng Việt bị hiển thị lỗi, hãy kiểm tra ba chỗ: bảng mã của cơ sở dữ liệu, charset trong chuỗi DSN và thẻ meta charset của trang HTML. Cả ba nên cùng là UTF-8.

Tài liệu và bước tiếp theo

Phần mô tả đầy đủ các phương thức của lớp PDO nằm ở tài liệu PDO trên PHP.net. Bạn cũng có thể tra cú pháp SQL ở tài liệu tham khảo MySQL.

Nếu chưa có hình dung tổng thể, bài lộ trình học PHP và MySQL cho người mới sẽ giúp bạn biết mình đang ở giai đoạn nào và nên học gì tiếp.

Việc nhỏ để bạn tự làm

Hãy viết một tệp PHP kết nối tới bảng “sinhvien” và in danh sách ra bảng HTML. Sau đó thêm biểu mẫu nhỏ để chèn sinh viên mới, dùng câu lệnh chuẩn bị sẵn. Cuối cùng, thử nhập một chuỗi có dấu nháy đơn vào ô tên và xem trang vẫn chạy bình thường. Khi làm được cả ba, bạn đã nắm được phần cốt lõi của việc nối PHP với MySQL.

Có câu hỏi về bài này?

Làm theo mà kết quả khác bài, hoặc thấy bước nào chưa rõ? Gửi email kèm tên bài và ảnh chụp màn hình, chúng tôi sẽ xem và cập nhật bài khi cần.