11

つい最近、PHP / MySQLでPDOを使用するように切り替え、数十のクエリを変換しました。それらのほとんどは機能しましたが、この非常に簡単なものは例外をスローします$sql->execute()

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

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));

しかし、それでも同じ結果になります。明らかに何が間違っているのか、または他のすべてのクエリが機能したのになぜこのクエリが機能しないのかを誰かが理解していますか?

事前にどうもありがとうございました!

4

2 に答える 2

15

これはバグではありません。1つのプレースホルダーに対して2つのパラメーターを指定します。

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

する必要があります

$sql->execute(array(':username' => $username));
于 2012-07-10T06:50:51.860 に答える
7

bindParam ':username',$username()メソッドでのみ機能します。

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

ここを見てください:http ://www.php.net/manual/en/pdostatement.bindparam.php

実行するには、入力専用値の正しい配列を渡す必要があります。

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

プレースホルダー:

これを使用することもできます:

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

ただし、このためには、クエリを次のように変更する必要があります。

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

?palceholderとして機能し、配列から変数を取得します。SQLステートメントでより多くのプレースホルダーを使用すると、関数はすべての変数をその順序で配列から取り出します。

于 2012-07-10T06:59:48.533 に答える