2011-11-28 34 views
7

Sự hiểu biết về PDO mà tôi đã có cho đến bây giờ là PDO sẽ sử dụng các câu lệnh chuẩn bị sẵn có ở đó, và mô phỏng chúng ở nơi không thể. Tôi cũng hiểu rằng nơi mà mysql đã được quan tâm, báo cáo chuẩn bị thực sự sẽ được sử dụng miễn là bạn đã giao tiếp với một phiên bản của mysql hỗ trợ chúng.PDO, Mysql và phát biểu bản địa chuẩn bị

Trên thực tế, trang hướng dẫn sử dụng PHP cho trình điều khiển PDO MySQL nói nhiều. Tuy nhiên, trên một câu hỏi SO khác, tôi đã giúp đỡ trên How to replace all occurencies of char with elements from array?, một người nào đó đã đưa ra nhận xét rằng điều này là không đúng, và thực tế PDO mô phỏng các câu lệnh chuẩn bị khi nói chuyện với cơ sở dữ liệu MySQL.

Tôi đã không có nhiều may mắn tìm bằng chứng để trả lại các khiếu nại được đưa ra, nhưng tôi đã phát hiện ra rằng có một thuộc tính PDO :: ATTR_EMULATE_PREPARES có thể được cấu hình để chuyển đổi mô phỏng câu lệnh đã chuẩn bị.

vậy sự thật của vấn đề là gì? PDO có thực sự không sử dụng các câu lệnh chuẩn bị với mysql không? Nếu không, nó có thể bị buộc phải làm như vậy, và nếu có, bạn nên làm điều đó? Tôi đã luôn luôn giả định rằng như mysql có các câu lệnh chuẩn bị thực sự mà PDO sẽ sử dụng chúng, như được yêu cầu trong hướng dẫn sử dụng. Hướng dẫn sử dụng không chính xác?

CHỈNH SỬA ĐỂ THÊM: Gần đây tôi đã đọc một vài bài báo ít nhất là cung cấp lý do chính đáng để giải thích tại sao truy vấn chuẩn bị thực được tắt theo mặc định. Các kịch bản PHP có xu hướng ngắn ngủi và chỉ chạy đủ lâu để tạo ra một phản hồi cho một yêu cầu, sau đó tất cả các tài nguyên của chúng được deallocated. Đối với bất kỳ truy vấn nào, bạn chỉ thực thi một lần cho mỗi yêu cầu, bạn thực sự phải thực thi 2 lệnh SQL (lệnh chuẩn bị và lệnh thực thi) để cho bất kỳ câu lệnh đã chuẩn bị nào chỉ được thực thi khi bạn có thể thực sự nhận được hiệu suất hơi kém hơn so với mô phỏng tuyên bố chuẩn bị. Đối với các truy vấn phải được chạy trong một câu lệnh chuẩn bị vòng lặp thực thì có lẽ sẽ hoạt động tốt hơn nhưng các trường hợp như vậy tương đối hiếm trong loại mô hình yêu cầu/phản hồi PHP thường được sử dụng cho.

Tôi vẫn nghĩ rằng các câu lệnh chuẩn bị thực sự là thích hợp hơn nhưng ít nhất tôi có một lời giải thích hợp lý về lý do tại sao PDO sử dụng truy vấn giả lập theo mặc định.

Trả lời

5

PDO có thực sự không sử dụng câu lệnh đã chuẩn bị với mysql không?

Có, theo mặc định (ít nhất là với phiên bản tôi đã kiểm tra) nhưng chế độ gốc có thể được bật theo cách thủ công.

Nếu không, nó có thể bị buộc phải làm như vậy

Bằng cách sử dụng PDO::ATTR_EMULATE_PREPARES thiết lập, tên của nó là khá tự giải thích.

$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 

bạn có nên làm điều đó không?

Đó là câu hỏi khó nhất của tất cả chúng.
Vâng, tôi muốn nói - có, bạn nên. Nếu bạn chọn PDO làm trình điều khiển db của bạn, không có điểm nào trong việc sử dụng nó trong chế độ mô phỏng.

+0

Cảm ơn bạn đã trả lời. Tuy nhiên, nó đặt ra câu hỏi, nếu nó hỗ trợ nó thì tại sao nó lại bị tắt theo mặc định? – GordonM

+0

Đó là vấn đề tương thích, tôi tin. –

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