2011-07-08 45 views
19

Mọi thứ tôi đã đọc cho đến nay về PDO (đối tượng dữ liệu PHP) gần như quá tốt là đúng.Nhược điểm của PDO (đối tượng dữ liệu PHP)

Ý tôi là:

  • của nó nhanh hơn sau đó mysql hoặc mysqli.
  • Nó có cùng cú pháp cho nhiều trình điều khiển cơ sở dữ liệu.
  • với các tuyên bố đã chuẩn bị, nó an toàn cho việc tiêm SQL.
  • bạn có thể tìm nạp dữ liệu trực tiếp vào đối tượng.

Nhưng điểm bất lợi của PDO là gì?

+0

Điều tương tự như mọi khi với PHP: loại không an toàn có nghĩa là một mớ hỗn độn không thể giải quyết nếu nhà phát triển không bị xử lý kỷ luật. Bug săn địa ngục. Thông thường. – bdares

+2

@bdares Nó thực sự khá loại an toàn, và lập luận của bạn là chống lại PHP và bản chất của nó, không phải chống lại PDO. –

+0

Tôi không biết ý bạn là gì bởi cùng một cú pháp cho tất cả cơ sở dữ liệu. Nếu bạn có nghĩa là sql, bạn là sai. Pdo là một lớp trừu tượng truy cập dữ liệu và không phải là một trừu tượng cơ sở dữ liệu, sql vẫn khác nhau. Nếu bạn có nghĩa là trong việc đưa ra các truy vấn, thì bạn có thể đúng, nhưng viết một trình bao bọc đơn giản cung cấp cho bạn điều tương tự nếu bạn muốn thay đổi kiểu cơ sở dữ liệu. – frostymarvelous

Trả lời

15

Mọi thứ tôi đã đọc cho đến nay về PDO (đối tượng dữ liệu PHP) gần như quá tốt là đúng.

Tôi sử dụng PDO mỗi ngày và đó là lý do. Mặc dù vậy, tôi đã viết một trình bao bọc, bởi vì cá thể PDO mặc định làm những thứ tôi không thích (ví dụ như không thành công) và API có thể tốt hơn rất nhiều. Cấu hình với hằng số không phải là cách tiếp cận mặc định của tôi. Ngoài ra, tôi đã tạo ra một số phương pháp tiện lợi.

Sau đó mysql hoặc mysqli nhanh hơn.

Có phải không? Tôi không biết bạn đã chọn cái này ở đâu, và nó có thể đúng, nhưng tôi chưa từng nghe về PDO nhanh hơn các thư viện MySQL nguyên gốc.

Nó có cùng cú pháp cho nhiều trình điều khiển cơ sở dữ liệu.

Sắp xếp. Tôi sử dụng PostgreSQL rất nhiều và mã khác với khi bạn đang làm việc với MySQL. Điều này có ý nghĩa mặc dù, như PostgreSQL làm việc với các chuỗi được đặt tên, trong khi MySQL làm việc với "tăng tự động", là một chuỗi trên mỗi bảng. Có sự khác biệt giữa các cơ sở dữ liệu mà PDO không thể trừu tượng, ngay cả khi nó chỉ dành cho cơ sở dữ liệu truy cập.

với tuyên bố đã chuẩn bị, nó an toàn cho việc tiêm sql.

Bạn cũng có thể prepare statements with mysqli, vì vậy tôi không thấy điều này như một điểm yếu nhất định. Tôi thường sử dụng các câu lệnh đã được chuẩn bị, và tôi thích cú pháp PDO của trường:

Nhưng đâu là những bất lợi của PDO, điều mà có nhiều ưu điểm cũng phải có sự chống đối.

API ít trực quan hơn đối với tôi, tôi nghĩ API của mysqli có ý nghĩa hơn. Tuy nhiên, nếu bạn viết một wrapper cho nó cho mình, đó là một thư viện rất phong nha. Dưới đây là the wrapper I wrote để sử dụng PDO một chút lành mạnh hơn, có nhiều ví dụ khác trôi dạt trên internet.

EDIT: Ồ, và James Anderson là đúng; nó có hỗ trợ Oracle kém. Tôi không sử dụng Oracle, vì vậy tôi không thấy đó là một nhược điểm lớn.

+1

PDO có thể nhanh hơn mysql_ * khi sử dụng câu lệnh đã chuẩn bị nhiều lần vì ít dữ liệu cần được gửi tới máy chủ mysql cho câu lệnh đã chuẩn bị, tuy nhiên không nhanh hơn khi thực hiện nhiều câu lệnh chuẩn bị và thực thi chúng vài lần và nhanh hơn mysqli. – Mike

+1

Trong tầm nhìn của tôi PDO có thể * nhanh hơn mysql * trong ** không cho phép/làm khó hơn cho các lập trình viên lame không có nền db phong nha, nhưng một OO rắn **, truy vấn db 26 lần với các truy vấn xấu thay vì chỉ một với truy vấn * right *. – ZJR

+0

^Lần này một triệu. – mopsyd

0

Tôi nhớ đọc ở đâu đó rằng một trong những bất lợi của PDO là mất nhiều thời gian truy vấn hơn một chút. (Xin lỗi tôi không có tham chiếu đến bài viết đó), hy vọng một số chuyên gia có thể nói về nó.

3

Hai điểm yếu mà tôi biết:

Không hoặc hỗ trợ Oracle kém!

Một số lần truy cập hiệu suất trên các tập hợp kết quả lớn.

Theo như tôi lo ngại "nhược điểm" đầu tiên là một lý do khác để tránh Oracle. Thứ hai hiếm khi có vấn đề.

5

Cơ chế ràng buộc không hoạt động với tên cột hoặc bảng.

ví dụ đơn giản:

CREATE TABLE :bar (rowId int) 

SELECT :foo FROM :bar 

Trên mặt tươi sáng, đây không phải là một cái gì đó bạn thường cần hoặc muốn làm.

Nhưng khi bạn làm ... PDO để bạn treo. Các giải pháp được bằng tay concating cùng chuỗi truy vấn của bạn trong khi làm bằng tay thoát:

$foo = some_escape_logic($dirtyFoo); 
$bar = some_escape_logic($dirtyBar); 

$db->query("SELECT {$foo} FROM {$bar}"); 

kết quả SQL luôn được trả về như chuỗi

lấy() trả về một mảng các giá trị chuỗi, ngay cả khi bảng SQL loại là số. Ví dụ, một bảng với bigint/chuỗi/cột bigint trả:

array('rowId' => '1', 'name' => 'Fred', 'age' => '12'); 

thay vì:

array('rowId' => 1, 'name' => 'Fred', 'age' => 12); 

Là một tích cực, bạn sẽ không bao giờ mất độ chính xác từ một không phù hợp giữa PHP và SQL loại. Kiểu juggling trong PHP cũng đảm bảo rằng bạn hiếm khi nhận thấy rằng dữ liệu ban đầu được mã hóa thành chuỗi.

Là một tiêu cực, điều này có thể là một nỗi đau khi đi qua kết quả DB để cái gì đó như json_encode(), vì bạn sẽ kết thúc với các giá trị số trích dẫn:

{ "rowId": "1", "name": "Fred", "age": "12" } 

thay vì

{ "rowId": 1, "name": "Fred", "age": 12 } 

Trong một thế giới lý tưởng, các kiểu đầu ra tự động đúc từ fetch() sẽ được điều khiển thông qua đối số tùy chọn.

+0

Tôi đã tìm thấy vấn đề đầu tiên được trích dẫn ở đây một thời gian trước đây. Hóa ra khi tôi đã học đủ rằng tôi đã làm chương trình quan hệ cơ sở dữ liệu sai. Tôi đã sửa nó và không bao giờ tìm thấy vấn đề này nữa. Dù sao +1 –

+0

Kết quả SQL luôn được trả về dưới dạng chuỗi - Dường như là trường hợp với trình điều khiển mysql, nhưng không phải là trình điều khiển postgres. Nếu bạn đang sử dụng postgres với PDO, nó sẽ cố gắng ánh xạ các giá trị tới loại PHP tương đương gần nhất – GordonM

5

Sau đó mysql hoặc mysqli nhanh hơn.

sai. trong cuộc sống thực, nó nói chung chậm hơn.

Nó có cùng cú pháp cho nhiều trình điều khiển cơ sở dữ liệu.

cho các chức năng API - có, tất nhiên. nhưng nó sẽ không giúp bạn với các phương ngữ SQL khác nhau.

với tuyên bố đã chuẩn bị, nó an toàn cho việc tiêm sql.

được bảo đảm chống lại tiêm sql, Bốn vấn đề cần phải được thoát đúng cách:

  • chuỗi
  • số
  • định danh
  • khai thác

khi PDO chỉ bao gồm linh sam t hai.

Các vấn đề liên quan