2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

LaravelでselectRawでバインドした時に「Invalid parameter number」エラー発生

Last updated at Posted at 2022-03-03

状況

LaravelでselectRawを使いselect文を書き、バインド変数を設定しクエリを発行したところInvalid parameter numberのエラーが発生した。

$data = 100;

$query = self::selectRaw(
    "'?' as test_column",
    [$data]
);

return $query->get()->toArray();
message: "SQLSTATE[HY093]: Invalid parameter number (SQL: select '100' as test_column from `test_table`)"

Invalid parameter number(パラメータの数合ってないよ!)ってなってるけど、バインド変数の数(selectRawの第2引数)もあってるし、エラーで出力されてるSQL見るとちゃんとバインドされてるし何でだ。。。と途方に暮れました。。。
https://readouble.com/laravel/8.x/ja/queries.html

結論

バインド変数の前後の'(シングルコーテーション)を削除したら問題なく動いた

$data = 100;

$query = self::selectRaw(
    "? as test_column",
    [$data]
);

return $query->get()->toArray();

本来もっと複雑なSQLでの出来事だったので、数値型の値を文字列として連結して扱いたかったので、シングルコーテーション無しで?を書き、CONCATを使って連結して文字列にすることで解決

CONCAT('Point(', ?, ' ', ?, ')')) AS `test_column`"

補足

'で値をくくっても問題なく値は取得できる(取得した値がstring型かint型かの違い)

$query = self::selectRaw(
    "'100' as test_column",
);

return $query->get()->toArray();
// 問題なく動作する
$query = self::selectRaw(
    "100 as test_column",
);

return $query->get()->toArray();
// 問題なく動作する

考察

エラーメッセージからすると、バインド変数の数(?の数)とバインドする値の数(selectRawの第2引数の配列の長さ)が一致していないエラーなので、Laravelの中でSQLの中のシングルコーテーションの中にある?の数の算出がうまくいっていないものと考えられる。
ちょっとソースコード読んでみるかな。。。

2
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?