Khi truy cập cơ sở dữ liệu trong PHP, chúng tôi có hai lựa chọn: MySQLI và PDO. Vì vậy, những gì bạn nên biết trước khi chọn một? Sự khác biệt, hỗ trợ cơ sở dữ liệu, sự ổn định và mối quan tâm về hiệu suất sẽ được nêu trong bài viết này.
Nếu bạn thường xuyên làm việc với các cơ sở dữ liệu trong PHP, bạn có thể muốn kiểm tra phạm vi các tập lệnh và ứng dụng hữu ích cho cả MySQLI và PDO trên thị trường Envato.
Bản tóm tắt
PDO | Mysqli | |
Hỗ trợ cơ sở dữ liệu | 12 trình điều khiển khác nhau | MySQL chỉ |
API | OOP | OOP + Thủ tục |
Sự liên quan | Dễ | Dễ |
Tham số được đặt tên | Đúng | Không |
Ánh xạ đối tượng | Đúng | Đúng |
Không [client side] | Đúng | Không |
Ánh xạ đối tượng | Báo cáo chuẩn bị [phía khách hàng] | Báo cáo chuẩn bị [phía khách hàng] |
Màn biểu diễn | Đúng | Đúng |
Sự liên quan
Dễ
// PDO $pdo = new PDO["mysql:host=localhost;dbname=database", 'username', 'password']; // mysqli, procedural way $mysqli = mysqli_connect['localhost','username','password','database']; // mysqli, object oriented way $mysqli = new mysqli['localhost','username','password','database'];
Tham số được đặt tên
Đúng
Không
Ánh xạ đối tượng
Báo cáo chuẩn bị [phía khách hàng]PDO supports 12 different drivers, opposed to MySQLi, which supports MySQL only.
Màn biểu diễn
var_dump[PDO::getAvailableDrivers[]];
Nhanh
Thủ tục lưu trữ
Đó là một cinch để kết nối với cơ sở dữ liệu với cả hai điều này:considerably easier than using the numeric binding:
$params = array[':username' => 'test', ':email' => $mail, ':last_login' => time[] - 3600]; $pdo->prepare[' SELECT * FROM users WHERE username = :username AND email = :email AND last_login > :last_login']; $pdo->execute[$params];
Xin lưu ý rằng các đối tượng / tài nguyên kết nối này sẽ được coi là tồn tại thông qua phần còn lại của hướng dẫn này.
$query = $mysqli->prepare[' SELECT * FROM users WHERE username = ? AND email = ? AND last_login > ?']; $query->bind_param['sss', 'test', $mail, time[] - 3600]; $query->execute[];
Hỗ trợ API
Cả PDO và MySQLI đều cung cấp API hướng đối tượng, nhưng MySQLI cũng cung cấp API thủ tục - giúp người mới hiểu dễ hiểu hơn. Nếu bạn quen thuộc với trình điều khiển PHP MySQL gốc, bạn sẽ thấy việc di chuyển sang giao diện MySQLI thủ tục dễ dàng hơn nhiều. Mặt khác, một khi bạn làm chủ PDO, bạn có thể sử dụng nó với bất kỳ cơ sở dữ liệu nào bạn mong muốn!MySQLi doesn't support named parameters.
Hỗ trợ cơ sở dữ liệu
Ưu điểm cốt lõi của PDO so với MySQLI nằm trong hỗ trợ trình điều khiển cơ sở dữ liệu của nó. Tại thời điểm viết bài này, PDO hỗ trợ 12 trình điều khiển khác nhau, trái ngược với MySQLI, chỉ hỗ trợ MySQL.
class User { public $id; public $first_name; public $last_name; public function info[] { return '#'.$this->id.': '.$this->first_name.' '.$this->last_name; } }
Để in danh sách tất cả các trình điều khiển mà PDO hiện đang hỗ trợ, hãy sử dụng mã sau:
Điều đó có nghĩa là gì? Vâng, trong các tình huống khi bạn phải chuyển dự án của mình để sử dụng cơ sở dữ liệu khác, PDO làm cho quá trình minh bạch. Vì vậy, tất cả những gì bạn sẽ phải làm là thay đổi chuỗi kết nối và một vài truy vấn - nếu họ sử dụng bất kỳ phương pháp nào không được hỗ trợ bởi cơ sở dữ liệu mới của bạn. Với MySQLI, bạn sẽ cần viết lại mọi đoạn mã - các truy vấn bao gồm.
$query = "SELECT id, first_name, last_name FROM users"; // PDO $result = $pdo->query[$query]; $result->setFetchMode[PDO::FETCH_CLASS, 'User']; while [$user = $result->fetch[]] { echo $user->info[]."\n"; } // MySQLI, procedural way if [$result = mysqli_query[$mysqli, $query]] { while [$user = mysqli_fetch_object[$result, 'User']] { echo $user->info[]."\n"; } } // MySQLi, object oriented way if [$result = $mysqli->query[$query]] { while [$user = $result->fetch_object['User']] { echo $user->info[]."\n"; } }
Tham số được đặt tên
Đây là một tính năng quan trọng khác mà PDO có; Các tham số liên kết dễ dàng hơn đáng kể so với việc sử dụng ràng buộc số:SQL injection security, as long as the developer uses them the way they were intended [read: escaping / parameter binding with prepared statements].
... Đối lập với cách MySQLI:
$_GET['username'] = "'; DELETE FROM users; /*"
Liên kết tham số đánh dấu câu hỏi có vẻ ngắn hơn, nhưng nó gần như không linh hoạt như các tham số được đặt tên, do thực tế là nhà phát triển phải luôn luôn theo dõi thứ tự tham số; Nó cảm thấy "hacky" trong một số trường hợp.
// PDO, "manual" escaping $username = PDO::quote[$_GET['username']]; $pdo->query["SELECT * FROM users WHERE username = $username"]; // mysqli, "manual" escaping $username = mysqli_real_escape_string[$_GET['username']]; $mysqli->query["SELECT * FROM users WHERE username = '$username'"];
Thật không may, MySQLI không hỗ trợ các tham số được đặt tên.var_dump[PDO::getAvailableDrivers[]];
2 not only escapes the string, but it also quotes it. On the other side,
var_dump[PDO::getAvailableDrivers[]];3 will only escape the string; you will need to apply the quotes manually.
// PDO, prepared statement $pdo->prepare['SELECT * FROM users WHERE username = :username']; $pdo->execute[array[':username' => $_GET['username']]]; // mysqli, prepared statements $query = $mysqli->prepare['SELECT * FROM users WHERE username = ?']; $query->bind_param['s', $_GET['username']]; $query->execute[];
Ánh xạ đối tượng
Ánh xạ đối tượng
Báo cáo chuẩn bị [phía khách hàng]
Bản tóm tắt
Màn biểu diễn
Nhanh
Bạn có thấy bài đăng này hữu ích?
Web mọi thứ; Kỹ sư IT; Kỹ sư Zend PHP5.3; Người tổ chức Debconf11; Người đam mê nguồn mở và nhà phát triển Android & Ruby Wannabe.