PHP
laravel

Laravel の whereRaw は使っても良い

More than 1 year has passed since last update.

【whereRawは使わない】Laravelで複数条件をする方法【既出】

この記事をみて、ちょっと気になったので。

結論から言うと DB::whereRaw() であっても、第2引数の $bindings を使えば言及されているようなSQLインジェクション問題は起きません。

言及されている問題のある書き方

リンク先のコード
$user = Input::get("user");
$password = Input::get("password");//ハッシュ化するものとするが例なので省略
User::whereRaw("user = '" . $user . "AND password = '".$password."'"); 

正しい DB:: whereRaw() の書き方

php
$user = Input::get("user");
$password = Input::get("password");//ハッシュ化するものとするが例なので省略
User::whereRaw('user = :user and password = :password', ['user' => $user,'password' => $password]);

// または

User::whereRaw('user = :user',['user' => $user])->whereRaw('password = :password',['password' => $password]);

確かにあげられているケースであればリンク先に書かれているように「DB::where() を2回使う」という対応がシンプルで正しいけれど、Laravel から利用できないデータベース側の関数を使いたい場合などには自分で頑張ってエスケープして DB::raw() を使うよりも、DB::whereRaw() を正しく使う事でエスケープを Laravel 側に任せるほうが安全。

こんな感じ
DB::table('posts')->whereRaw('YEARWEEK(:postDate,1) = YEARWEEK(created_time,1)',['postDate' => $postDate]);