PDO - 参数号无效

Chr*_*ris 9 php mysql pdo

就在最近,我转而使用PHP/MySQL中的PDO并转换了几十个查询.他们中的大多数都在工作,但是这很容易就会引发异常$sql->execute()

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

PDOStatement :: execute()pdostatement.execute SQLSTATE [HY093]:参数号无效:绑定变量数与...中的标记数不匹配

经过研究,我发现了这个链接:https://bugs.php.net/bug.php?id = 60515

...因此尝试将查询更改为

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

但仍然有相同的结果.有人看到了什么是明显错误的,或者为什么这个查询在其他所有人都没有的时候不起作用?

非常感谢你提前!

xda*_*azz 12

这不是错误,您只为一个占位符提供了两个参数.

$sql->execute(array(':username',$username));
Run Code Online (Sandbox Code Playgroud)

应该

$sql->execute(array(':username' => $username));
Run Code Online (Sandbox Code Playgroud)


Wol*_*Dev 6

':username',$username仅在bindParam()方法的工作原理:

$sql->bindParam(':username', $username, PDO::PARAM_STR);
Run Code Online (Sandbox Code Playgroud)

看看这里:http://www.php.net/manual/en/pdostatement.bindparam.php

对于execute,您需要传递正确的仅输入值数组:

$sql->execute(array(':username' => $username));
Run Code Online (Sandbox Code Playgroud)

占位符:

你也可以用这个:

$sql->execute(array($username));
Run Code Online (Sandbox Code Playgroud)

但为此您需要将查询更改为:

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

的?作为palceholder工作并从数组中获取变量.当您在SQL语句中使用更多占位符时,该函数会按顺序从数组中获取所有变量.