2010-11-08 66 views
0

我正在尝试修改这个Modx片段,以便它接受从db而不是默认值返回的多个值。SQL多个WHERE子句问题

默认情况下,tvTags仅用于设置一个变量。我对它进行了一些修改,以便将它分解为变量列表。我想查询数据库中的每个变量并返回与每个变量关联的标签。然而,我很困难,因为我对SQL和PHP相当陌生。

我插入$ region,它的工作原理,但我真的不知道如何为$国家变量添加更多的WHERE子句。

感谢您的帮助!

if (!function_exists('getTags')) { 

    function getTags($cIDs, $tvTags, $days) { 

     global $modx, $parent; 

     $docTags = array(); 

     $baspath= $modx->config["base_path"] . "manager/includes"; 
     include_once $baspath . "/tmplvars.format.inc.php"; 
     include_once $baspath . "/tmplvars.commands.inc.php"; 

     if ($days > 0) { 
      $pub_date = mktime() - $days*24*60*60; 
     } else { 
      $pub_date = 0; 
     } 

     list($region, $countries) = explode(",", $tvTags); 

     $tb1 = $modx->getFullTableName("site_tmplvar_contentvalues"); 
     $tb2 = $modx->getFullTableName("site_tmplvars"); 
     $tb_content = $modx->getFullTableName("site_content"); 
     $query = "SELECT stv.name,stc.tmplvarid,stc.contentid,stv.type,stv.display,stv.display_params,stc.value"; 
     $query .= " FROM ".$tb1." stc LEFT JOIN ".$tb2." stv ON stv.id=stc.tmplvarid "; 
     $query .= " LEFT JOIN $tb_content tb_content ON stc.contentid=tb_content.id "; 
     $query .= " WHERE stv.name='".$region."' AND stc.contentid IN (".implode($cIDs,",").") "; 
     $query .= " AND tb_content.pub_date >= '$pub_date' "; 
     $query .= " AND tb_content.published = 1 "; 
     $query .= " ORDER BY stc.contentid ASC;"; 

     $rs = $modx->db->query($query); 
     $tot = $modx->db->getRecordCount($rs); 
     $resourceArray = array(); 
     for($i=0;$i<$tot;$i++) { 
      $row = @$modx->fetchRow($rs); 
      $docTags[$row['contentid']]['tags'] = getTVDisplayFormat($row['name'], $row['value'], $row['display'], $row['display_params'], $row['type'],$row['contentid']); 
     } 
      if ($tot != count($cIDs)) { 
      $query = "SELECT name,type,display,display_params,default_text"; 
      $query .= " FROM $tb2"; 
      $query .= " WHERE name='".$region."' LIMIT 1"; 
      $rs = $modx->db->query($query); 
      $row = @$modx->fetchRow($rs); 
      $defaultOutput = getTVDisplayFormat($row['name'], $row['default_text'], $row['display'], $row['display_params'], $row['type'],$row['contentid']); 
      foreach ($cIDs as $id) { 
       if (!isset($docTags[$id]['tags'])) { 
        $docTags[$id]['tags'] = $defaultOutput; 
       } 
      } 
     } 
      return $docTags; 
    } 
} 

回答

2

你不更WHERE条款添加,您使用AND S和OR S中已经存在的where子句。我会说在$query .= " WHERE stv.name = '".$region...之后你放

foreach ($countries as $country) 
{ 
    $query .= "OR stv.name = '{$country}', "; 
} 

但是我不知道你希望查询如何工作。

+0

感谢您的回答!它似乎没有工作,因为$国家不是一个数组。我真的只需要查询$ region中包含的值并返回与之关联的标签,然后查询与$国家相关联的值并返回标签。 $ region =“地区”和$国家=“国家”抱歉的混乱。 – Vecta 2010-11-08 20:29:26

+0

哦,对不起,没问题。没有循环的同样的解决方案,'$ query。=“或stv.name ='{$ countries}',”;' – 2010-11-09 07:20:08