2016-06-23 2 views
4

Я попытаюсь выполнить запрос ниже, но не уверен, что это предотвратит внедрение SQL-кода?Yii2: Можно ли связать массив с условием IN() в соединении?

 $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).

+0

Хорошо, я удалил мой ответ, потому что 'where' условия дифф из 'on', и вам нужны условия' on'. Кстати, я открываю этот вопрос, возможно, вас интересует: https://github.com/yiisoft/yii2/issues/11827 – slinstj

ответ

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(); 
+0

Это действительно работает @slinstj. Спасибо огромное! –

0

Yii2 может создать параметризованных В состоянии, передавая состояние как массив именно:

['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 будет синтаксически равным, как описано в INNER JOIN condition in WHERE clause or ON clause?. Для readability and ease of maintenance, вы можете оставить сравнения для столбцов таблиц в состоянии присоединиться:

$rows = (new \yii\db\Query()) 
     ->select('*') 
     ->from('user') 
     ->innerJoin('post', 'post.user_id = user.id') 
     ->where(['post.some_column' => $value, 'post.status' => $status]) 
     ->all(); 
+0

Извините, я использовал 'leftJoin' в своем проекте. Я пишу запрос в моем вопросе - это просто демо. Я использовал ту же ситуацию в своем проекте. как использовать 'IN()' on 'OnCondition'? –

Смежные вопросы