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.
Đ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
@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. –
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