Laravel 框架中 whereRaw like 引數繫結問題

xjm_發表於2020-05-19

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 協議》,轉載必須註明作者和本文連結

相關文章