我有下面的代码:
$inputs = "1,2,3,4,5"; $sql = "SELECT * FROM obj WHERE id IN(:input)"; $commond = Yii::app()->db->createCommand($sql); $commond->bindValue(":input", $inputs , PDO::PARAM_STR);
但是查询结果不正确,这样的IN条件如何绑定参数?
IN
3ks5zfa01#
现在这样使用它
$command = Yii::app()->db->createCommand() ->select() ->from('tableName') ->where(array('in', 'id', explode(',', $inputs)));
我将尝试使用$command->bindValue()方法返回。
$command->bindValue()
ttygqcqt2#
在我的项目中遇到过这个问题几次之后,我想出了下面的Yii解决方案,使用了CDbCriteria,这有点笨拙,但是提供了参数计数匹配的安全性。当应用到您的示例中时,我的代码将是:
$inputs = array(1,2,3,4,5); $criteria = new CDbCriteria(); $criteria->addInCondition('id',$inputs); $sql = 'SELECT * FROM obj WHERE '.$criteria->condition; $command = Yii::app()->db->createCommand($sql); $results = $command->queryAll(true, $criteria->params);
更新
实际上,Yii内置了一个更简洁的方法:
$results = Yii::app()->db->createCommand() ->select() ->from('obj') ->where(['in', 'id', $inputs]) ->queryAll();
参见文档
gupuwyp23#
在CDbCommand中使用Yii的方法链来构建查询(如Uday Sawant的答案)通常是一个不错的选择。如果不得不逐段构建查询并不理想,一个不错的选择是将参数数组扁平化,这样就不会绕过SQL注入保护,如下所示:
$sql = "SELECT * FROM obj WHERE id IN (:id_array) AND other_field = :other_value"; $args = array( 'id_array' => array(1, 2, 3, 4, 5), 'other_value' => 12, ); // Flatten array arguments into multiple parameters, // replacing with parameter lists in the SQL $newArgs = array(); $replace = array(); foreach($args as $oldKey => $input) { if(!is_array($input)) { $newArgs[$oldKey] = $args[$oldKey]; continue; } $replace[':'.$oldKey] = array(); foreach($input as $i => $value) { $replace[':'.$oldKey][] = ':'.$oldKey.$i; $newArgs[$oldKey.$i] = $value; } $replace[':'.$oldKey] = implode(', ', $replace[':'.$oldKey]); } $sql = strtr($sql, $replace); $query = Yii::app()->db->createCommand($sql); $query->params = $newArgs; $query->queryAll();
在此示例中,最后的sql和参数为:
SELECT * FROM obj WHERE id IN (:id_array0, :id_array1, :id_array2, :id_array3, :id_array4) AND other_field = :other_value array( 'id_array0' => 1, 'id_array1' => 2, 'id_array2' => 3, 'id_array3' => 4, 'id_array4' => 5, 'other_value' => 12, )
在使用原始SQL作为首选标准的项目中,最大的好处是您可以将其捆绑为一个实用函数,并在任何查询中重用它。遗憾的是Yii不能自动以这种方式扩展数组参数,但您也可以将此支持添加到直接使用PDO的项目中。
bakd9h0s4#
在Yii中有两种方法:
bindValue()
bindValues($paramsArray)
$paramsArray = array(':index'=>$value)
$query = "UPDATE viewing_request SET ViewingApiResponse=:ViewingApiResponse ,ViewingApiData = :ViewingApiData WHERE id='{$id}'"; $executArray = array( ':ViewingApiResponse'=>$data['ViewingApiResponse'], ':ViewingApiData'=>$data['ViewingApiData'] ); $result = Yii::$app->db->createCommand($query) ->bindValues($executArray) ->execute();
4条答案
按热度按时间3ks5zfa01#
现在这样使用它
我将尝试使用
$command->bindValue()
方法返回。ttygqcqt2#
在我的项目中遇到过这个问题几次之后,我想出了下面的Yii解决方案,使用了CDbCriteria,这有点笨拙,但是提供了参数计数匹配的安全性。
当应用到您的示例中时,我的代码将是:
更新
实际上,Yii内置了一个更简洁的方法:
参见文档
gupuwyp23#
在CDbCommand中使用Yii的方法链来构建查询(如Uday Sawant的答案)通常是一个不错的选择。如果不得不逐段构建查询并不理想,一个不错的选择是将参数数组扁平化,这样就不会绕过SQL注入保护,如下所示:
在此示例中,最后的sql和参数为:
在使用原始SQL作为首选标准的项目中,最大的好处是您可以将其捆绑为一个实用函数,并在任何查询中重用它。遗憾的是Yii不能自动以这种方式扩展数组参数,但您也可以将此支持添加到直接使用PDO的项目中。
bakd9h0s4#
在Yii中有两种方法:
bindValue()
用于上述问题1.需要
bindValues($paramsArray)
,即$paramsArray = array(':index'=>$value)
我使用下面的代码,是为我工作完美: