如何在Yii框架中绑定数组参数?

oyxsuwqo  于 2022-11-09  发布在  其他
关注(0)|答案(4)|浏览(195)

我有下面的代码:

$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条件如何绑定参数?

3ks5zfa0

3ks5zfa01#

现在这样使用它

$command = Yii::app()->db->createCommand()
    ->select()
    ->from('tableName')
    ->where(array('in', 'id', explode(',', $inputs)));

我将尝试使用$command->bindValue()方法返回。

ttygqcqt

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

参见文档

gupuwyp2

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的项目中。

bakd9h0s

bakd9h0s4#

在Yii中有两种方法:

  1. bindValue()用于上述问题
    1.需要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();

相关问题