我对PDO语句和Yii2查询有一些疑问/怀疑。 我已经在这里搜索并阅读了一些问题,但没有找到解决方案。 所以我有一个像这样的数组
array (size=3)
0 => string '12345'
1 => string '6789'
2 => string '101258'
从该数组中,我创建一个字符串以插入到SQL查询的IN条件中
//$split_var is the previous array
$var_query = implode( "','" , $split_var);
//'12345','6789','101258' i obtained this string
所以现在我尝试以这种方式创建查询
$tupla = Yii::$app->db->createCommand("
SELECT * FROM oln, opt WHERE opt_cod = oln_opt_cod AND oln_cod IN ( :var_query) order by oln_cod ASC
")
->bindValue(':var_query' ,$var_query);
$result = $tupla->queryAll();
它没有给我任何错误,但是结果查询不是我所期望的。实际上,我会得到该查询:
SELECT * FROM oln, opt WHERE opt_cod = oln_opt_cod AND oln_cod IN ( '01Y0BIAN'',''05C2LARG'',''0661NO00') order by oln_cod ASC
问题出在IN条件下,我不知道为什么还要添加另一个'
。
我也尝试了这种方法,但是我不知道如何以这种方式绑定参数:
$query = (new \yii\db\Query())
->select('*')
->from('oln, opt')
->where('opt_cod = oln_opt_cod')
->andwhere('in', 'oln_cod',[':oln_cod' => $var_query])
->addParams([':oln_cod' => $var_query])
->orderBy('oln_cod ASC')
->all();
答案 0 :(得分:1)
由于转义,另外添加了'
。由于$var_query
实际上是一个字符串,因此它将被视为单个字符串值,并且任何'
都将被转义以防止SQL注入。您以错误的方式建立IN
条件时,应分别绑定IN
中的每个ID:
$tupla = Yii::$app->db->createCommand(
"SELECT * FROM oln, opt WHERE opt_cod = oln_opt_cod"
. " AND oln_cod IN (:var_query1, :var_query2, :var_query3) order by oln_cod ASC"
)
->bindValue(':var_query1', 12345)
->bindValue(':var_query2', 6789)
->bindValue(':var_query3', 101258);
使用foreach绑定所有参数可能会更容易。使用Yii包装器也要简单得多,它具有构建IN
条件的好捷径:
$query = (new \yii\db\Query())
->select('*')
->from('oln, opt')
->where('opt_cod = oln_opt_cod')
->andwhere(['in', 'oln_cod', $split_var]) // $split_var is array of values
->orderBy('oln_cod ASC')
->all();