2010-11-08 3 views
0

Я пытаюсь изменить этот фрагмент Modx, чтобы он принимал несколько значений, возвращаемых из db, а не по умолчанию.Проблема множественного предложения WHERE

tvTags, по умолчанию, предназначался только для одной переменной. Я немного изменил его, чтобы он взорвался в список переменных. Я хотел бы запросить базу данных для каждой из этих переменных и вернуть теги, связанные с каждым. Тем не менее, у меня возникают трудности, поскольку я довольно новичок в SQL и PHP.

Я подключился к $ region, и он работает, но я не уверен, как добавить дополнительные предложения WHERE для переменной $ countries.

Благодарим за помощь!

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 с и OR с в уже существующем, где положение. Я бы сказал, после того, как линии $query .= " WHERE stv.name = '".$region... вы положили в

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

, но я не знаю, как вы хотите, чтобы запрос на работу.

+0

Спасибо за ваш ответ! Похоже, что это не работает, хотя страны $ не являются массивом. Мне просто нужно запросить значение, содержащееся в области $ region, и вернуть связанные с ним теги, затем запросить значение, связанное с $ странами, и вернуть с ним теги. $ region = "region" и $ countries = "countries" Извините за путаницу. – Vecta

+0

О, извините, проблем нет. То же решение без цикла, '$ query. =" OR stv.name = '{$ countries}', ";' –