2

我想做这样的事情:

$select = $myTbl->select()
->from('download_log')
->joinLeft(...... etc........
->joinLeft(...... etc........
->joinLeft(...... etc........);

//Filter all configured bots (Google, Yahoo, etc.)
if(isset($this->_config->statistics->bots)){
 $bots = explode(',',$this->_config->statistics->bots);
 foreach ($bots as $bot){
  $select = $select->where("user_agent NOT LIKE '%$bot%'");
 }
}

$select = $select->where("download_log.download_log_ts BETWEEN '".$start_date." 00:00:00' AND '".$end_date." 23:59:59'");

但是输出的查询不正确,因为 orWhere 子句没有在唯一的 AND 子句中组合在一起。我想知道是否可以在一对括号中重新组合那些 NOT LIKE 子句。

我目前的替代方案如下:

  //Filter all configured bots (Google, Yahoo, etc.)
  if(isset($this->_config->statistics->bots)){
   $bots = explode(',',$this->_config->statistics->bots);
   foreach ($bots as $bot){
    $stmt .= "user_agent NOT LIKE '%$bot%' AND ";
   }
   $stmt = substr($stmt,0,strlen($stmt)-4); //remove the last OR
   $select = $select->where("($stmt)");
  }

谢谢!

4

3 回答 3

1

谢谢!我终于这样做了:

//Filter all configured bots (Google, Yahoo, etc.)
if(isset($this->_config->statistics->bots)){
        $bots = explode(',',$this->_config->statistics->bots);
        foreach ($bots as $bot){
                $stmt .= $myTbl->getAdapter()->quoteInto("user_agent NOT LIKE ? AND ",%$bot%);
        }
        $stmt = trim($stmt, ' AND '); //remove the last AND
        $stmt .= 'OR user_agent IS NULL';
        $select = $select->where("($stmt)");
}
于 2010-05-03T08:44:26.327 回答
0

Zend_Db_Select支持orWhere您正在寻找的条款。

于 2010-04-29T14:44:24.117 回答
0

您当前的替代方案看起来是最佳选择。这是一个稍有改动的版本,它使用正确的引用,以防万一有任何不好的东西滑入 $bots

$botWhere = '';
foreach ($bots as $bot){
    $botWhere .= $myTbl->getAdapter()->quoteInto('user_agent NOT LIKE ? AND ', "%$bot%");
}
$botWhere = trim($botWhere, ' AND ');
$select = $select->where($botWhere);
于 2010-04-29T15:02:26.863 回答