Tôi nên học pdo hay mysqli?

Cơ sở dữ liệu, ứng dụng web sẽ ra sao nếu không có chúng, đặc biệt khi bạn đang làm việc với PHP. OK, đó không phải là một tuyên bố hoàn toàn công bằng, vì có rất nhiều nguồn dữ liệu sẵn có cho các ứng dụng hiện đại

Có các tệp phẳng, như tệp CSV hoặc tệp văn bản. Có cơ sở dữ liệu, như MySQL, PostgreSQL, Oracle, Firebase, Sybase và MS SQLServer. Sau đó, có các nguồn dữ liệu NoSQL mới hơn, bao gồm Hadoop, Redis, Cassandra và MongoDb, trong số một loạt các tùy chọn khác. Nhưng hôm nay tôi muốn xem xét câu hỏi về cơ sở dữ liệu

Nếu bạn đã biết về PHP một thời gian thì bạn sẽ biết rằng ngay từ những ngày đầu tiên PHP đã có hiệu lực được kết hợp với MySQL vì bản phân phối mặc định đi kèm với trình điều khiển MySQL. Tuy nhiên, khi thời gian trôi qua, tiện ích mở rộng này bắt đầu có dấu hiệu cũ và không được dùng nữa để thay thế cho MySQLi (i để cải thiện)

Nhưng sau đó, PHP tiếp tục phát triển với tốc độ rất nhanh và trở thành (tùy thuộc vào quan điểm của bạn) nhận biết hoàn toàn về cơ sở dữ liệu hoặc không phụ thuộc vào cơ sở dữ liệu với sự xuất hiện của tiện ích mở rộng PDO (Đối tượng dữ liệu PHP) đặc biệt. Vì vậy, trong bài đăng này, tôi muốn xem xét lý do tại sao bạn nên xem xét chuyển từ MySQLi sang PDO trong các ứng dụng PHP của mình

PDO là gì?

Nếu bạn chưa quen với PDO hoặc đây là lần đầu tiên bạn nghe về nó, thì đây là định nghĩa từ hướng dẫn sử dụng PHP

Tiện ích mở rộng Đối tượng dữ liệu PHP (PDO) xác định giao diện nhẹ, nhất quán để truy cập cơ sở dữ liệu trong PHP. Mỗi trình điều khiển cơ sở dữ liệu triển khai giao diện PDO có thể hiển thị các tính năng dành riêng cho cơ sở dữ liệu dưới dạng các chức năng mở rộng thông thường

PDO cung cấp một lớp trừu tượng truy cập dữ liệu, có nghĩa là, bất kể bạn đang sử dụng cơ sở dữ liệu nào, bạn đều sử dụng các chức năng giống nhau để đưa ra các truy vấn và tìm nạp dữ liệu. PDO không cung cấp sự trừu tượng hóa cơ sở dữ liệu; . Bạn nên sử dụng lớp trừu tượng toàn diện nếu bạn cần cơ sở đó

Hy vọng rằng từ hai đoạn văn này, bạn có thể bắt đầu hiểu tại sao PDO lại là tương lai và tại sao, theo thời gian, tiện ích mở rộng MySQLi có thể đi theo con đường của tiện ích mở rộng MySQL. Tự hỏi mình đi. Tại sao lại sử dụng tiện ích mở rộng dành riêng cho nhà cung cấp khi bạn có thể sử dụng tiện ích mở rộng hỗ trợ nhiều nhà cung cấp?

Tôi không muốn có vẻ như tôi đang phá hỏng tiện ích mở rộng MySQLi. Đó là một thư viện tốt cung cấp nhiều chức năng và đã được thử nghiệm tốt. Tuy nhiên, PDO có một số tính năng làm cho nó khác biệt, những tính năng có thể rất đáng để bạn cân nhắc. Cụ thể, tôi đề xuất ba điều sau

  • sự linh hoạt của nhà cung cấp
  • Giảm đường cong học tập
  • tham số được đặt tên

Hãy xem xét từng thứ trong số này

Tính linh hoạt của nhà cung cấp

Trong nhiều năm, câu thần chú về khả năng thay đổi nhà cung cấp cơ sở dữ liệu, không bị khóa vào bất kỳ nhà cung cấp cụ thể nào, đã được quảng cáo là yêu cầu chính đối với các ứng dụng chuyên nghiệp, thậm chí còn được coi là viên đạn bạc an toàn thực sự. Nhưng trên thực tế, một khi đã được chọn, các ứng dụng có thường xuyên thay đổi nhà cung cấp không?

Tuy nhiên, nếu có nhu cầu, thật tuyệt khi biết rằng bạn có thể làm được mà không gặp nhiều rắc rối. PDO, hơn bất kỳ tiện ích mở rộng nào khác, cung cấp lộ trình thực hiện thay đổi ngắn hơn nhiều, vì nó hỗ trợ 12 nhà cung cấp cơ sở dữ liệu, bao gồm

  • PostgreSQL
  • SQLite
  • mysql
  • tiên tri
  • ODBC
  • Máy chủ MS SQL & Azure
  • con chim lửa
  • Informix
  • DB2 của IBM
  • Sybase
  • con nít
  • 4D

Đó là một danh sách ấn tượng các cơ sở dữ liệu được hỗ trợ ngay lập tức. Tính linh hoạt này thậm chí còn phù hợp hơn nếu ứng dụng của bạn hỗ trợ nhiều nhà cung cấp, ngay từ đầu. Chắc chắn, bạn phải xem xét SQL mà bạn đang viết và nó có thể di động trên từng cơ sở dữ liệu hay được viết theo cách nó chỉ tận dụng các tính năng dành riêng cho cơ sở dữ liệu khi nó có thể làm như vậy

Nhưng tùy thuộc vào thiết lập của bạn, nếu bạn muốn thay đổi từ nhà cung cấp này sang nhà cung cấp khác, tùy thuộc vào SQL của bạn, tất cả những gì có thể được yêu cầu là thay đổi DSN (tên nguồn dữ liệu)

Giảm đường cong học tập

Bây giờ, hãy xem xét đường cong học tập giảm, khi một tiện ích mở rộng sẽ hỗ trợ nhiều nhà cung cấp cơ sở dữ liệu. Khi bạn hoặc nhóm của bạn chỉ phải học một thư viện thay vì nhiều thư viện, bạn có thể đạt được cả sự thông thạo và thành thạo sớm hơn rất nhiều. Bạn không cần phải học nhiều thư viện. Khi bạn đã thành thạo một cái, bạn đã hoàn thành

Chắc chắn, đó là một điều dễ dàng để nói về lý thuyết, nhưng trong thực tế, nó sẽ mất thời gian. Tuy nhiên, bằng cách giảm tải giáo dục, bạn giảm đầu tư tổng thể cần thiết. Điều duy nhất bạn cần biết là triển khai SQL của nhà cung cấp và các công cụ kiểm tra truy vấn của họ. Nhưng đây là trường hợp bất kể bạn đang làm việc với nhà cung cấp nào

Tôi không nghĩ có thể nói quá về việc bằng cách đầu tư vào một thư viện thay vì nhiều thư viện, một loạt lợi ích sẽ hiện hữu như thế nào. Bao gồm các

  • Giảm thời gian để làm chủ thư viện
  • Giảm yêu cầu bảo trì
  • Giảm điểm tiềm năng của sự thất bại và lỗi

Đây là một tập hợp các lợi ích đơn giản, được cấp. Nhưng họ bắt đầu gợi ý về khoản đầu tư giảm cần thiết khi thành thạo một thư viện chung, thay vì thứ gì đó dành riêng cho nhà cung cấp. Điều đáng chú ý là mặc dù PDO là một thư viện chung, nhưng nó không nhẹ hoặc thiếu. Nó mạnh mẽ từng chút một, trong nhiều trường hợp còn mạnh hơn các thư viện cụ thể của nhà cung cấp

Ghi chú. PDO không làm mọi thứ mà MySQLi làm. Vì vậy, nếu bạn đang cân nhắc việc chuyển đổi, nếu bạn bị ràng buộc chặt chẽ với MySQL, sử dụng các tính năng cụ thể mà cơ sở dữ liệu khác không cung cấp hoặc PDO không sẵn sàng cung cấp, vui lòng xem xét việc chuyển đổi một cách cẩn thận

Tham số được đặt tên

Có, MySQLi có trình giữ chỗ, nhưng nó không có tham số được đặt tên. Không chắc chắn về sự khác biệt?

php

Ví dụ này chứa một truy vấn có hai tham số được đặt tên,. calo và. màu. Khi truy vấn được tạo nội bộ, các tham số có thể được sử dụng lại thường xuyên như mong muốn trên một loạt các yêu cầu. Chúng rõ ràng để đọc và dễ hiểu về mặt ngữ nghĩa

php
// MySQLi parameterized query
$stmt = $mysqli->prepare("'SELECT name, colour, calories FROM fruit WHERE calories < ? AND colour = ?'"));

Bây giờ hãy xem xét MySQLi, viết lại ví dụ bằng MySQLi. Bạn có thể thấy rằng truy vấn cũng giống như vậy, nhưng thay vì tham số được đặt tên, chúng tôi có dấu chấm hỏi hoặc trình giữ chỗ. Bây giờ chắc chắn, truy vấn vẫn rõ ràng. Nhưng một dấu chấm hỏi như một trình giữ chỗ không mang nhiều ý nghĩa ngữ nghĩa

PDO giới thiệu nhanh

Bây giờ chúng ta đã xem xét một loạt lý do sử dụng PDO thay vì MySQLi, hãy xem những điều cơ bản về cách sử dụng nó. Cụ thể, hãy xem cách thực hiện một số truy vấn cơ bản đối với các bản ghi cơ sở dữ liệu

Hãy thử biến điều này thành một ví dụ bán thực tế bằng cách sử dụng Cơ sở dữ liệu mẫu về nhân viên MySQL. Điều này cung cấp một loạt các bảng mô hình bảng lương mẫu của công ty, bao gồm nhân viên, phòng ban, tiền lương, v.v.

phụ thuộc

Bạn không cần phải làm theo nhiều ví dụ. Chỉ cần một thư mục dự án và ít nhất là PHP 5. 4 (lý tưởng là 5. 6)

Tạo kết nối

Đầu tiên chúng ta cần tạo kết nối đến cơ sở dữ liệu. Để làm điều đó, chúng tôi sẽ sử dụng mã dưới đây

php
$dbh = new PDO(
    'mysql:host=localhost;port:33060;dbname=employees',
    'homestead', 'secret'
);

Điều này tạo kết nối đến cơ sở dữ liệu của tôi trên máy chủ lưu trữ cục bộ, sử dụng cổng 33060, kết nối với cơ sở dữ liệu có tên là nhân viên, sử dụng thông tin đăng nhập của homestead và bí mật. Để biết thêm thông tin, hãy xem tài liệu PDO MySQL DSN

Chọn dữ liệu

Khi kết nối của chúng ta đã được thiết lập, hãy chọn một tập hợp hồ sơ người dùng, lọc người dùng theo những người có mức lương từ 40.000 đến 50.000 USD, làm việc trong lĩnh vực tiếp thị và được tuyển dụng sau ngày 1 tháng 1 năm 1985. Đây là truy vấn

php
$sql = "SELECT e.*, s.salary
FROM employees e
INNER JOIN salaries s ON (s.emp_no = e.emp_no)
INNER JOIN dept_emp de ON (de.emp_no = e.emp_no)
INNER JOIN departments d ON (d.dept_no = de.dept_no)
WHERE (
  s.salary between :minSalary AND :maxSalary 
  AND d.dept_name = :department
  AND e.hire_date > :hireDate
)";
$sth = $dbh->prepare($sql);
$sth->execute([
    ':minSalary' => 40000,
    ':maxSalary' => 50000,
    ':department' => 'Marketing',
    ':hireDate' => '1985-01-01',
]);
$results = $sth->fetchAll();
foreach ($results as $result) {
    print_r($result);
}

Thực hiện điều này sẽ trả về một mảng các mảng, chứa cả tham chiếu kết hợp và tham chiếu vô hướng cho mỗi cột trong tập kết quả, như ví dụ dưới đây cho thấy

php
Array
(
    [emp_no] => 10928
    [0] => 10928
    [birth_date] => 1961-11-01
    [1] => 1961-11-01
    [first_name] => Udaiprakash
    [2] => Udaiprakash
    [last_name] => Schmezko
    [3] => Schmezko
    [gender] => M
    [4] => M
    [hire_date] => 1991-04-07
    [5] => 1991-04-07
    [salary] => 40531
    [6] => 40531
)

Còn việc làm cho nó đơn giản hơn, bằng cách dưỡng ẩm một đối tượng giá trị đơn giản cho mỗi bản ghi trong tập kết quả thì sao?

php
class employee {
    public $emp_no;
    public $birth_date;
    public $first_name;
    public $last_name;
    public $gender;
    public $hire_date;
    public $salary;
}

Sau đó, để sử dụng đối tượng, chúng ta chuyển hai đối số cho phương thức fetchAll(), như bên dưới, PDO. FETCH_CLASS, yêu cầu nó cấp nước cho một đối tượng và tên của lớp cần cấp nước

php
$results = $sth->fetchAll(PDO::FETCH_CLASS, "employee");

Làm như vậy, kết quả bây giờ sẽ là các đối tượng ngậm nước, giống như ví dụ sau

php
employee Object
(
    [emp_no] => 10928
    [birth_date] => 1961-11-01
    [first_name] => Udaiprakash
    [last_name] => Schmezko
    [gender] => M
    [hire_date] => 1991-04-07
    [salary] => 40866

Tôi sẽ xem xét việc tạo, cập nhật và xóa, nhưng chức năng này phần lớn giống như những gì chúng ta đã thấy cho đến nay;

Tương lai của MySQLi

Theo hiểu biết tốt nhất của tôi, MySQLi sẽ không biến mất sớm và tôi không muốn đề xuất rằng nó nên hoặc nên. Đó là một thư viện được viết tốt và được thử nghiệm tốt, có một vị trí nhất định trong hệ sinh thái PHP. Ngoài ra, vì tôi không phải là một trong những người bảo trì, tôi không thể nói thay cho họ, cũng như không thể đưa ra bất kỳ tuyên bố nào thay mặt họ

Mặc dù vậy, điều tôi có thể nói là, theo quan điểm của riêng tôi, tôi khuyến khích bạn làm quen với PDO, nếu bạn chưa làm quen, ngoài những gì bạn đã đọc ở đây. Có một số lập luận rất thuyết phục để sử dụng nó, thay vì tiện ích mở rộng dành riêng cho nhà cung cấp cơ sở dữ liệu

kết thúc

Và đó vừa là phần giới thiệu về PDO, vừa là ba lý do chính đáng khiến bạn nên cân nhắc sử dụng nó, trên một thư viện cụ thể của nhà cung cấp, chẳng hạn như MySQLi, để tương tác với cơ sở dữ liệu. Trong khi, giống như bất kỳ thư viện đủ phức tạp nào, có rất nhiều thứ để tìm hiểu và học hỏi với PDO, khoản đầu tư sẽ xứng đáng;

PDO có an toàn hơn MySQLi không?

PDO an toàn hơn hai tùy chọn đầu tiên và nó cũng nhanh hơn so với MySQLi theo thủ tục và hướng đối tượng MySQLi. PDO là lớp truy cập cơ sở dữ liệu cung cấp giao diện nhanh và nhất quán để truy cập và quản lý cơ sở dữ liệu trong các ứng dụng PHP.

Tôi có thể sử dụng cả PDO và MySQLi không?

Có, có thể .

Sự khác biệt giữa PDO và MySQLi là gì?

Như đã nêu trước đó, cả PDO và MySQLi đều cực kỳ giống nhau, nhưng có một số khác biệt nhỏ về cú pháp. MySQLi tuân theo quy ước solid_case truyền thống của PHP, trong khi PDO sử dụng camelCase . Ngoài ra, các phương thức của MySQLi được sử dụng làm thuộc tính đối tượng, trong khi PDO sử dụng cú pháp truyền thống cho các hàm.

Một trong những ưu điểm chính của PDO là gì?

Ưu điểm của PDO . Nó không hỗ trợ các cú pháp dành riêng cho cơ sở dữ liệu. Tiện ích mở rộng PDO có thể truy cập bất kỳ cơ sở dữ liệu nào được viết cho trình điều khiển PDO. allows comparatively seamless switching between different databases and platforms, which can be easily done by changing the connection string. It does not support database-specific syntaxes. The PDO extension can access any database which is written for PDO driver.