【问题标题】:yii queryAll failes pass parameteryii queryAll 传递参数失败
【发布时间】:2014-03-16 16:29:06
【问题描述】:

我路过:

Yii::app()->db->createCommand($query)->queryAll(true,array(':bizid'=>$params));

查询:

 SELECT DISTINCT(BI.item_name)
 FROM items BI 
 WHERE BI.b_id IN (:bizid) ORDER BY BI.item_name ASC 

查询找不到结果,但是这个查询得到了结果:

SELECT DISTINCT(BI.item_name) as i_name FROM blacklist_items BI WHERE BI.business_id IN   (165,664,842,866,1234,3007,3030,3031,3032) ORDER BY BI.item_name ASC

为什么 queryAll 会失败?

【问题讨论】:

  • 每个可能的值都需要一个单独的占位符:stackoverflow.com/questions/9529406/…
  • 是因为未能为结果创建提议者索引。它不喜欢 $results['DISTINCT(BI.item_name)'] 之类的东西。但是,$results['i_name'] 很好。

标签: php mysql yii dao


【解决方案1】:

将 id 分配给数组:

$ids = [165,664,842,866,1234,3007,3030,3031,3032];

查询应该是:

$query = "SELECT DISTINCT(BI.item_name)"
 . " FROM items BI"
 . " WHERE BI.b_id IN (" . implode(',', $ids) . ") ORDER BY BI.item_name ASC 

【讨论】:

    【解决方案2】:

    在我的项目中多次遇到此问题后,我使用 CDbCriteria 提出了以下 Yii 变通方法,这有点 hacky,但提供了参数计数匹配的安全性。

    当应用于您的示例时,我的代码将是:

    $business_ids = array(1,2,3,4,5);
    $criteria = new CDbCriteria();
    $criteria->addInCondition('business_id',$business_ids);
    
    $sql = 'SELECT DISTINCT(item_name) 
              FROM items 
             WHERE '.$criteria->condition.'
          ORDER BY item_name ASC';
    
    $command = Yii::app()->db->createCommand($sql);
    $results = $command->queryColumn($criteria->params);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-30
      • 1970-01-01
      相关资源
      最近更新 更多