LaravelでwhereRaw
を使う際、$bindings
を使用すればSQLインジェクションは起きません。
しかし、$bindings
に配列を使用するとエラーが発生するためエラーが発生しない方法を考えてみました。
通常の使用方法
SQLインジェクションが起きる可能性がある使い方
$user_id = 1;
$builder->select('name')
->from('person')
->whereRaw('user_id = ' . $user_id);
SQLインジェクションを回避するために$bindings
を使用します。
正しい使い方
$user_id = 1;
$builder->select('name')
->from('person')
->whereRaw('user_id = :user_id', ['user_id', $user_id]);
配列を使用した場合
配列を渡してみる。
$user_ids = [1, 2, 3];
$builder->select('name')
->from('person')
->whereRaw('user_id in :user_ids', ['user_ids', $user_ids]);
実行した場合、Array to string conversion at......
というエラーが発生します。
エラーが発生しない書き方
$user_ids = [1, 2, 3];
$bindings = trim(str_repeat('?,', count($user_ids)), ',');
$builder->select('name')
->from('person')
->whereRaw('user_id in (' . $bindings . ')', $user_ids);
この書き方でエラーが発生しないと思います!