Laravel SQLでWhereをIF文で追加したり外したりしたい

IT関連

LaravelでSQL文を直で打ちたいときは、コントローラーの冒頭で

use DB;

を宣言し、

 

こんな感じでSQL文を書く。

$TABLE = DB::select("
           ここにSQL文     
      ");

書籍を2つほど読んだがこんな感じだった。

 

 

例えばこんなときはどうだろう。

//リクエストの値を変数に代入する
$keyword = $request->input('keyword');

//SQLを実行
$TABLE = DB::select("SELECT AAA,BBB FROM HOGELIB.TABLE
        WHERE CCC = '1' AND DDD = ".$keyword."
      ");

画面からリクエストでinputの値を受け取り、それをSQL文に噛ませている。

 

だがリクエストの値がブランクの場合は、条件に合致するわけがないので、WhereにあるDDDはそもそもSQL文に組み込みたくないというとき。

//リクエストの値を変数に代入する
$keyword = $request->input('keyword');

//SQLを実行
$TABLE = DB::select("SELECT AAA,BBB FROM HOGELIB.TABLE WHERE CCC = '1'";

         if(isset($request->keyword)){    
            "AND DDD = ".$keyword."
             }

         ");

こんなの動くわけないのだが、一応やってみた。なぜならselect(“SQL文”)で一文だから。間にif文を噛ませると動かない。

 

クエリビルダやEloquentでは、->で組み立てていくとき、IF文を間に挟んで組まないようにすればいいのだが、どうしたものか。

 

別に難しく考える必要はなかった。

//SQL文を組み立て
$SQL = "SELECT AAA,BBB FROM HOGELIB.TABLE WHERE CCC = '1'";

//リクエスト値がセットされていればSQL文に追加
 if(isset($request->keyword)){
   $keyword = $request->keyword;
   $SQL = $SQL."AND DDD = '$keyword' ";
 }

//SQLを実行
$TABLE = DB::select($SQL);

こうする。変数にSQL文を組み立てていき、最後にDB::select($SQL)とすればいい。

 

変なこと言ってるかもしれませんが、自分の備忘録なのでお許しを。他にいいやり方があれば教えてください。

あとこれをそのまま動かすと、見事にSQLインジェクションの餌食になります。

htmlspecialcharsなどでサニタイズは行ってください。

コメント

  1. test より:

    そのやり方はSQLインジェクションが考慮されておらず、値がサニタイズされない

    • kouji より:

      ご指摘ありがとうございます。
      他のページには書いていたのですがセキュリティ系は考慮して書いておりません。
      ゆえにhtmlspecialcharsなどは通常よくあるh()などで関数化したりするので、
      わざわざhtmlspecialchars($keyword,ENT_QUOTES)と書いても恥ずかしいだけかなと思いまして・・。
      それをLaravel側の機能ので出来るのならぜひ教えて頂きたい次第です。
      とにかくサニタイズのことは注意書きで追記しておきます。コメント感謝です。

タイトルとURLをコピーしました