2016-06-28 19 views
0

で文字をエスケープLaravel私は、クエリをコーディングしています:は、クエリビルダ

$result = \DB::table('order_items as oi') 
     ->selectRaw(
      'order_item_type as item_type, 
      order_item_id as item_id, 
      if(order_item_type = "App\\\Models\\\Book", oi.price, invoices.price) as price 
      ) 

はちょうど私がエスケープ文字やクエリdoesntのマッチApp\Models\Bookを使用することを抱えている、ifステートメントに注意してください。私がlaravelデバッガで出力クエリを検査するとき:

select order_item_type as item_type, 
order_item_id as item_id, 
if(order_item_type = "App\\Models\\Book", oi.price, invoices.price) as price,... 

ここで何が起こるのですか? laravelクエリビルダはスラッシュを1つ削除してから、mysqlエンジンは実行時に2番目のスラッシュを削除しますか?

EDIT:
しかし、どこか別の場所に同じクエリで私はエスケープ文字を使用where句を持っており、それが正常に動作します:

->leftjoin('books', function ($q) { 
      $q->on('q3.order_item_id', '=', 'books.id') 
       ->where('q3.order_item_type', '=', 'App\\Models\\Book'); 
     }) 

と出力クエリ部分laravelデバッガによって:

left join `books` on `q3`.`order_item_id` = `books`.`id` and 
`q3`.`order_item_type` = 'App\Models\Book' 

ifに私はエスケープcを使用しなければならない理由を誰が説明することができますharacterですが、joinのみエスケープ文字が必要ですか?

->leftjoin('books', function ($q) { 
      $q->on('q3.order_item_id', '=', 'books.id') 
       ->where('q3.order_item_type', '=', 'App\Models\Book'); 
     }) 
+0

4つまたは2つのバックスラッシュを使用しようとしましたか? 3つのバックスラッシュが間違って見えます。 –

+0

@IvanYarychこの動作は常に同じではなく、EDITを見てください。 – alex

答えて

1

どちらもPHP 1とスラッシュをエスケープ2のMySQL:私もwhereクエリビルダ方法内の任意のエスケープ文字を使用してようなコードを書いていない場合は、実際に
は何の問題もないでしょう。 MySQLは、NO_BACKSLASH_ESCAPES3 SQLモードが有効になっていない限り、エスケープする必要があります。デフォルトでは無効になっています。 MySQL内でエスケープシーケンスは解釈されるか無視されます。\nは新しい行に変換され、\mは無視され、mに変換されます。

最初のPHPは\\\\\に変換するので、2つは1つにエスケープされます。その後、MySQLは\\\に逃げ、リテラルスラッシュを必要としていることを理解しています。 :)

selectRaw()は、MySQLに生のクエリを送信するので、自分でデータをエスケープする必要があります。他のすべての非rawメソッドは、Laravel Query Builder内でこれを内部的に行います。したがって、これらのことを気にする必要はありません。

PHPは、MySQLとは異なり、スラッシュを無視しません。一重引用符で囲まれた文字列を使用すると、終了していないスラッシュはリテラルとして認識されるため、エスケープする必要はありません。文字列がスラッシュで終わったら必要です。二重引用符で囲まれた文字列には、エスケープシーケンスが翻訳されています。あなたの例はまだそれらと一緒に動作しますが、間違ってしまうケースがあります。

+0

ありがとう、私は編集を追加しました。もう一度質問をしてください。 – alex

+0

新しい質問にも答えるように私の回答が更新されました。 ;) –

+0

私は内部の 'where'クエリビルダメソッドでエスケープ文字を使用しておらず、正常に動作しています。 'どこで'メソッドは、すべてのユーザ(開発者)の書かれた文字をリテラルとして想定するのでしょうか? – alex