Laravel 框架中使用 whereRaw+like 的引數繫結問題
1.緣由
因為業務需要一個輸入框框搜多個欄位,故在程式碼中使用
$list->whereRaw("concat(name,phone) like '%".$keywords."%'");
- name 和 phone 為示例欄位
2.問題
使用此方法,沒有對sql注入做任何處理,僅輸入 like ‘ 或 ‘ 就會報錯
,要使用類似於 PDO 引數繫結進行傳參,以避免 SQL 注入的風險
3.解決
Laravel 中 whereRaw 方法預設傳參為1個引數,檢視底層實現如下:
public function whereRaw($sql, $bindings = [], $boolean = 'and')
{
$this->wheres[] = ['type' => 'raw', 'sql' => $sql, 'boolean' => $boolean];
$this->addBinding((array) $bindings, 'where');
return $this;
}
同時在社群wiki中,summer大佬指出要避免sql注入和第二引數的使用方式
問題:對於like模糊查詢,按社群wiki中寫的如下程式碼,不生效(列印檢視sql應該是沒解析成功):失敗的程式碼
$list = $list->whereRaw("concat(name,phone,) like '%?%'",[$keywords]);
最終實現如下:成功的程式碼:
$list = $list->whereRaw("concat(name,phone,) like ?",["%$keywords%"]);
4.總結
還是自己對基礎掌握不牢,雖然之前都學過,但慢慢的不用也就忘了。
從使用框架的東西后,一些框架封裝好的東西直接上手用,但底層的實現都沒注意過
本作品採用《CC 協議》,轉載必須註明作者和本文連結