bind_param()で「Number of variables doesn’t match number of parameters」が出る時

MySQL

PHPからMySQLのデータをプリペアドステートメントで検索する時、どこも間違ってないはずなのにbind_param()する時に以下のエラーが出ました

mysqli_stmt::bind_param(): Number of variables doesn’t match number of parameters in prepared statement in hoge php on line 1

略:パラメータと値の数がマッチしないよ

ちなみに、この時に実行したSQLは以下のようなものです

SELECT name,'?番' AS No 
FROM user;

このSQL文に対して、1個の値と型(s)をちゃんと指定してます

にも関わらずエラーが出る

解決方法

バインドするプレースホルダ?を文字列から出す

SELECT name,CONCAT(?,'番') AS No 
FROM user;

CONCATは文字列を結合する関数です

一旦バインドを実行して、?を値に置換した後に文字列結合するというわけです

原因

バインドするプレースホルダ?が、文字列の中に入ってると正しく置換対象として認識されないためです

なので最初のSQL文だと、プレースホルダがないのにバインドする値を指定してるので、機械側からしたら、

「置き換えたい値はわかったけど、SQLの中にプレースホルダーねーじゃん!」となっていたというお話です