PDO của bạn được định cấu hình để mô phỏng các truy vấn đã chuẩn bị, trong khi mysqli đang sử dụng các truy vấn chuẩn bị thực sự.
Truy vấn đã chuẩn bị liên kết chuỗi ''1''
dưới dạng giá trị tham số nguyên. PHP cưỡng chế nó thành một số nguyên bằng cách sử dụng một cái gì đó như intval()
. Bất kỳ chuỗi nào có ký tự đầu không phải là số đều được PHP hiểu là 0, vì vậy giá trị tham số được gửi sau chuẩn bị là giá trị 0.
Truy vấn chuẩn bị giả sử dụng nội suy chuỗi (thay vì ràng buộc) để thêm chuỗi ''1''
vào truy vấn SQL trước MySQL phân tích cú pháp nó. Nhưng kết quả là tương tự, vì SQL cũng xử lý một chuỗi có các ký tự đứng đầu không phải số trong ngữ cảnh số nguyên là giá trị 0.
Sự khác biệt duy nhất là những gì kết thúc trong nhật ký truy vấn chung khi tham số bị ràng buộc trước khi chuẩn bị so với sau khi chuẩn bị.
Bạn cũng có thể làm cho PDO sử dụng các truy vấn chuẩn bị thực sự, vì vậy nó sẽ hoạt động giống như mysqli trong trường hợp này:
$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
Tái bút:Điều này có thể chứng minh một lý do chính đáng tại sao thường bắt đầu các giá trị id bằng 1 thay vì 0.