Yii2:我可以将数组绑定到连接中的IN()条件吗?

时间:2016-06-23 11:19:59

标签: php mysql yii2 sql-injection

我会尝试下面的查询,但不确定是否阻止sql注入?

        $status = [1, 2, 3];
        $param = implode(', ', $status);

        $rows = (new \yii\db\Query())
            ->select('*')
            ->from('user')
            ->leftJoin('post', "post.user_id = user.id AND post.some_column = $value AND post.status IN ($param)");
            ->all();
  

返回预期结果但可能会发生sql注入。我的IN条件看起来像IN (1, 2, 3)

        $rows = (new \yii\db\Query())
            ->select('*')
            ->from('user')
            ->leftJoin('post', "post.user_id = user.id AND post.some_column = :sid AND post.status IN (:param)", [':param' => $param, ':sid' => $value]);
            ->all();
  

仅比较数组中的第一个元素,因为它看起来像这个IN ('1, 2, 3')它包含单个字符串而不检查数组中的第二个元素仅适用于第一个元素。

我参考下面的链接,但不知道如何实现这个条件。

Can I bind an array to an IN() condition?

请提供有关如何在IN() Condition部分联接中使用On的解决方案(PDO / Yii2 / mysql)。

2 个答案:

答案 0 :(得分:3)

基于this issue

        $rows = (new \yii\db\Query())
        ->select('*')
        ->from('user')
        ->leftJoin('post', ['post.user_id' => new \yii\db\Expression('user.id'), 'post.some_column' => $sid, 'post.status' => $statuesArray]);
        ->all();

答案 1 :(得分:0)

Yii2可以通过将条件作为数组传递来创建参数化的IN条件,即:

['post.status' => $status]

但是,将连接条件转换为数组格式将无效,如Yii guide中所述:

  

请注意,where()的数组格式旨在将列与值匹配,而不是将列与列匹配,因此以下内容无法按预期工作:['post.author_id' => 'user.id'],它将匹配post.author_id列字符串'user.id'的值。建议在此处使用更适合连接的字符串语法:

     

'post.author_id = user.id'

由于您使用的是INNER JOIN,因此将WHERE中的联接条件放在ON而不是$rows = (new \yii\db\Query()) ->select('*') ->from('user') ->innerJoin('post', 'post.user_id = user.id') ->where(['post.some_column' => $value, 'post.status' => $status]) ->all(); 中的结果将在语法上相同,如INNER JOIN condition in WHERE clause or ON clause?中所述。对于readability and ease of maintenance,您可以在连接条件中保留表列的比较:

{{1}}