2010-11-08 7 views
0

J'essaie de modifier cet extrait Modx afin qu'il accepte plusieurs valeurs renvoyées par la base de données au lieu de la valeur par défaut.SQL Clause WHERE multiple Problème

tvTags, par défaut, ne devait être défini que sur une variable. Je l'ai modifié un peu pour qu'il devienne une liste de variables. Je voudrais interroger la base de données pour chacune de ces variables et retourner les balises associées à chacun. Cependant, j'ai des difficultés car je suis assez nouveau pour SQL et PHP.

J'ai branché $ region et cela fonctionne, mais je ne suis pas vraiment sûr de savoir comment ajouter plus de clauses WHERE pour la variable $ pays.

Merci pour votre aide!

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; 
    } 
} 

Répondre

2

Vous n'ajoutez pas dans plusieurs clauses WHERE, vous utilisez AND s et OR s dans la clause where déjà existante. Je dirais après la ligne $query .= " WHERE stv.name = '".$region... que vous mettez dans

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

mais je ne sais pas comment vous voulez que la requête fonctionne.

+0

Merci pour votre réponse! Cela ne semble pas fonctionner, car $ countries n'est pas un tableau. J'ai juste besoin d'interroger la valeur contenue dans $ region et de renvoyer les balises qui y sont associées, puis interroger la valeur associée à $ pays et renvoyer les balises avec. $ region = "region" et $ countries = "countries" Désolé pour la confusion. – Vecta

+0

Oh désolé, pas de problème. Même solution sans la boucle, '$ query. =" OU stv.name = '{$ countries}', ";' –