2015-10-26 125 views
1

下面回顾关系:CDbCommand未能执行SQL语句:SQLSTATE [42S22]:列未找到谊

return array(
     'product' => array(self::BELONGS_TO, 'Product', 'product_id'), 
     'profile' => array(self::BELONGS_TO, 'Profile', 'profile_id'), 
     'rating' => array(self::BELONGS_TO, 'Rating', 'rating_id'), 
     'reviewcomments' => array(self::HAS_MANY, 'Reviewcomment', 'review_id'), 
     'reviewhelpfuls' => array(self::HAS_MANY, 'Reviewhelpful', 'review_id'), 
        'commentCounts' => array(self::STAT, 'Reviewcomment', 'review_id'), 
    ); 
下面

控制器代码:

$criteria = new CDbCriteria(); 
      $criteria->addCondition("t.seoUrl = :seoUrl"); 
      $criteria->addCondition("t.published = 1"); 
      $criteria->params = array("seoUrl"=>$seoUrl);    
      $data['product'] = Product::model()->find($criteria); 
      if($data['product']){ 
       $data['product']->hits = $data['product']->hits+1; 
       $data['product']->save(); 
      } else{ 
       throw new CHttpException(404, "Invalid Request for product"); 
      } 
      $product_id = $data['product']->id; 
      $criteria = new CDbCriteria(); 
      $criteria->addCondition("t.product_id = '$product_id'"); 

      if(isset($_GET['rating'])) 
      { 
       $rating_id = $_GET['rating']; 
       $criteria->addCondition("t.rating_id = '$rating_id'"); 
      }   


      $criteria->addCondition('t.status = "approved"'); 

      if(isset($_GET['sort'])) 
      { 
       $sorting = $_GET['sort']; 
       if($sorting=='newest') 
        $criteria->order = "t.postDate DESC"; 
       elseif($sorting=='oldest') 
        $criteria->order = "t.postDate ASC"; 
       elseif($sorting=='rating_high') 
        $criteria->order = "t.rating_id DESC"; 
       elseif($sorting=='rating_low') 
        $criteria->order = "t.rating_id ASC"; 
      } 

      $data['reviews'] = new CActiveDataProvider('Review', array(
       'criteria'=>$criteria, 
       'pagination'=>array('pagesize'=>4) 

      )); 

现在,当我运行这段代码,我得到CDbCommand未能执行SQL语句:SQLSTATE [42S22]:未找到列:1054未知列'where子句中't.rating_id'

感谢您的帮助

+0

我认为你必须检查列名称,它必须是'rating_id'以外的东西。 –

回答

0

使用 'T' 的别名,你的表的Intstead,开始使用getTableAlias(false, false) 你的情况,那就是:

$criteria->addCondition(Review::model()->getTableAlias(false, false).".rating_id = '$rating_id'"); 

更重要的是这个代码尖叫SQL注入

$rating_id = $_GET['rating']; 
$criteria->addCondition("t.rating_id = '$rating_id'"); 

切勿使用用户输入而不处理它。 Yii允许你绑定为你逃脱的值 - 没有SQL注入的威胁(至少据我所知)。你应该像这样创建你的标准:

$criteria->addCondition(Review::model()->getTableAlias(false, false).".rating_id = :rating_id"); 
$criteria->params = array(
    ':rating_id' => $rating_id, 
); 
相关问题