2012-07-10 69 views
5

Gần đây tôi đã chuyển sang sử dụng PDO trong PHP/MySQL và chuyển đổi một số truy vấn. Hầu hết trong số họ làm việc, tuy nhiên một trong rất dễ dàng này ném một ngoại lệ tại $sql->execute()PDO - Số tham số không hợp lệ

$sql=$pdo->prepare("SELECT id FROM user WHERE username = :username LIMIT 1"); 
$sql->execute(array(':username',$username)); 

PDOStatement :: thực hiện() pdostatement.execute SQLSTATE [HY093]: số tham số không hợp lệ: số biến ràng buộc không khớp với số các mã thông báo trong ...

Sau khi nghiên cứu, tôi thấy liên kết này: https://bugs.php.net/bug.php?id=60515

... và do đó đã cố gắng để thay đổi truy vấn để

$sql=$pdo->prepare("SELECT `id` FROM `user` WHERE `username` = :username LIMIT 1"); 
$sql->execute(array(':username',$username)); 

Nhưng vẫn có kết quả tương tự. Có ai nhìn thấy những gì rõ ràng là sai hoặc tại sao truy vấn này không hoạt động khi tất cả những người khác đã làm gì?

Cảm ơn bạn rất nhiều trước!

+0

"* PDO - Số tham số không hợp lệ ** mặc dù nó đúng ***". Không, không đúng. – Lion

+0

@Lion: vâng, bạn đúng ... đã thay đổi tiêu đề ... Tôi đã bị mù, cảm ơn sự giúp đỡ của bạn! – Chris

Trả lời

5

Các ':username',$username chỉ hoạt động trong bindParam() phương pháp:

$sql->bindParam(':username', $username, PDO::PARAM_STR); 

Hãy xem ở đây: http://www.php.net/manual/de/pdostatement.bindparam.php

Đối với thực hiện bạn cần phải vượt qua một đúng mảng giá trị chỉ nhập:

$sql->execute(array(':username' => $username)); 

Placeholder:

Bạn cũng có thể sử dụng này:

$sql->execute(array($username)); 

Nhưng đối với điều này, bạn cần phải thay đổi truy vấn của bạn như thế này:

$sql=$pdo->prepare("SELECT `id` FROM `user` WHERE `username` = ? LIMIT 1");  

Các? hoạt động như một người nắm giữ và lấy các biến từ mảng. Khi bạn sử dụng thêm trình giữ chỗ trong câu lệnh SQL của bạn, hàm sẽ lấy tất cả các biến ra khỏi mảng theo thứ tự của nó.

11

Đây không phải là lỗi, bạn cung cấp hai tham số cho chỉ một trình giữ chỗ.

$sql->execute(array(':username',$username)); 

nên

$sql->execute(array(':username' => $username)); 
+0

ôi chúa ơi ... cảm ơn! xấu hổ làm sao! – Chris

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