如何将参数传递给查询?

时间:2016-10-26 07:26:58

标签: php mysql laravel

我使用Laravel。如您所知,Laravel不支持查询的UNION子句。因此,当我想分页整个结果时,我必须将其写为raw。像这样:

$results = DB::select('SELECT id, title, description, imgPath
                       FROM news n
                       WHERE n.title LIKE %$q OR n.description LIKE %$q 
                       UNION ALL
                       SELECT id, title, description, imgPath
                       FROM productions p
                       WHERE p.title LIKE %$q OR p.description LIKE %$q
                      ');

正如我所说,我使用Laravel,那么如何将$q传递给Laravel中的查询?我试图做的就是使查询对SQL注入安全。这就是为什么我试图将参数传递给查询而不是直接在查询中使用它们的原因。

在纯PHP中,我可以这样做:

$st = $dbh->prepare('SELECT ... WHRER col LIKE %:q');
$st->bindParam(':q', $q, PDO::PARAM_INT);

我想在Laravel中做这样的事情。

2 个答案:

答案 0 :(得分:3)

是的,有联盟:https://laravel.com/docs/5.3/queries#unions

我没有测试过,但看起来应该是这样的:

$first = DB::table('news')
    ->select(['id', 'title', 'description', 'imgPath'])
    ->where(function($query) use ($q) {
        $query->where('title', 'like', "%$q")
              ->orWhere('description', 'like', "%$q");
    });

$result = DB::table('productions')
    ->select(['id', 'title', 'description', 'imgPath'])
    ->where(function($query) use ($q) {
        $query->where('title', 'like', "%$q")
              ->orWhere('description', 'like', "%$q");
    })
    ->unionAll($first)
    ->get();

注意:

通过工会,您无法开箱即用paginate。您需要自己创建paginator对象,如下所示:Laravel - Union + Paginate at the same time?

答案 1 :(得分:2)

您的纯PHP代码"也不会工作。您必须尊重SQL和PDO语法

$st = $dbh->prepare('SELECT ... WHRER col LIKE :q');
$st->bindParam(':q', "%$q");

会做的。

与Laravel相同:您必须在查询中定义占位符,然后将其作为参数发送

$sql = 'SELECT * FROM news WHERE title LIKE :q OR description LIKE :q';
$results = DB::select($sql, ['q' => "%$q"]);