Warning: PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens in
どんな時に出る?
→ 引数の数が合いませんえ、
と、上記のエラーは申しているようです。
後述しますが、最初に:deflag だけしか宣言してないのに
後からarrayで出てくる:idとはなんぞや。
とこのケースでは言われてるわけです。
ワイが実際にこのエラーに直面した際の具体例を書いていく。
どんな時に出た?
→ TODOリストを作っている最中。
htmlで作ったチェックボックスにチェックを入れると、
そのtodoの内容を消す、ということがしたかった。
正確には、DELETE文で消すわけではなくて、チェックボックスにチェックが入ると
UPDATE文が走ってデリートフラグが立つようにしたかった。
そこで書いたのがこのようなコード。(抜粋)
もしコードがポンコツだったらごめんなさい。
$sql = 'UPDATE td SET delete_flg = :deflag’;
$stmt = $dbh->prepare($sql);
return $stmt->execute(array(
':deflag' => 1, ':id' => $id));
}
deleteflg();
はい。:idが最初に宣言されてないので、数が合いませんけど、
って言われてしまったわけです。
下記のようにしたら出なくなりました。
要は:idを最初に書いてあげればよかったのです。
数が合うようになりました。
エラーは解消です。
$sql = 'UPDATE td SET delete_flg = :deflag,
WHERE id = :id';
$stmt = $dbh->prepare($sql);
return $stmt->execute(array(
':deflag' => 1, ':id' => $id));
}
deleteflg();
まだTODOアプリで、うんうん唸りながら作っている最中です。
もしかしたらこのコード自体全部書き直すかもしれません。
なんか自分で言うのもアレですが全体的に仕様やコードがいけてない気しかしない。。
とりあえず今回は、備忘のためと自身のアウトプット並びに言語化のために
エラーの話がしたかっただけなので、これで以上とします。
記事の内容が誤っていたり、改善点がある場合はお知らせいただけたら幸いです。
ご指摘は真摯に受け止める所存です。