2010-09-03 13 views
0

Je construis une fonction de recherche sur mon site Web et j'ai quelques problèmes pour localiser une erreur dans le SQL. Quatre instructions SQL sont utilisées pour renvoyer les comptes de la même recherche en utilisant les mots clés AND et OR. Le second ensemble d'instructions SQL renvoie les résultats réels des recherches ET et OU limitées en fonction du numéro de page de la recherche en cours. Ci-dessous, je vais montrer la fonction SQL pour la recherche et count et et. Le code pour les deux autres instructions SQL est le même, en utilisant uniquement OU à la place de AND.erreur dans votre syntaxe SQL - Obtenir cette erreur et ne peut pas localiser où l'erreur est

function _and_count($words) { 

    require_once("include/conn.inc.php"); 

    $arraysize = count($words); 

    $and_count_sql = "SELECT COUNT(DISTINCT tg_id) 
         FROM tg_keywords 
         WHERE tg_keyword="; 

    if ($arraysize > 1) { 
     foreach($words as $word){ 
      $count = 1; 
      if ($count == 1){ 
       $and_count_sql .= "'".$word."' AND "; 
      } 
      elseif ($count < $arraysize){ 
       $and_count_sql .= "tg_keyword='".$word."' AND "; 
      } 
      else { 
       $and_count_sql .= "'".$word."'"; 
      } 
      $count++; 
     } 

    } elseif ($words == 1) { 
     $and_count_sql .= "'".$words."'"; 
    } 

    $and_count_result = mysql_query($and_count_sql) 
     or die(mysql_error()); 

    return $and_count_result; 

} 


function _search_and($words, $startpos, $endpos) { 

    require_once("include/conn.inc.php"); 

    $arraysize = count($words); 

    $search_and_sql = "SELECT DISTINCT tg_id COUNT(*) AS nb 
         FROM tg_keywords 
         LEFT JOIN tg_info 
         ON tg_info.tg_id=tg_keywords.tg_id 
         WHERE tg_keyword="; 

    if ($arraysize > 1){ 
     foreach($words as $word) { 
      $count = 1; 
      if ($count == 1 && $count < $arraysize) { 
       $search_and_sql .= "'".$word."' AND "; 
      } elseif ($count == 1 && $count == $arraysize) { 
       $search_and_sql .= "'".$word."'"; 
      } elseif ($count < $arraysize) { 
       $search_and_sql .= "tg_keyword='".$word."' AND "; 
      } elseif ($arraysize == $count) { 
       $search_and_sql .= "'".$word."'"; 
      } 
      $count++; 
     } 
    } elseif ($arraysize == 1) { 
     $search_and_sql .= "'".$words."'"; 
    } else { 
     $search_and_sql .= "''"; 
    } 

    $search_and_sql .= "GROUP BY tg_id 
         ORDER BY nb DESC, tg_info.date_added ASC 
         LIMIT ".$endpos." OFFSET ".$startpos; 

    $search_and_result = mysql_query($search_and_sql, $link) 
     or die(mysql_error()); 

    $and_array = mysql_fetch_array($search_and_result); 

    return $and_array; 


} 

Un conseil serait grandement apprécié. Merci Archie

+0

Quelle erreur obtenez-vous? – dionyziz

+1

Quelle base de données? Affiche le résultat SQL String qui est créé. – JeffO

+0

Pourquoi faire un AND au lieu d'un IN? – XstreamINsanity

Répondre

4
 $search_and_sql = "SELECT DISTINCT tg_id COUNT(*) AS nb

virgule manquante entre tg_id et le comte.

Sa bonne pratique pour afficher la requête générée, à savoir. echo $ search_and_sql; avant mysql_query

+0

avait exactement la même réponse posté mais 3 min plus tard;) Supprimé et +1 à cichy – DmitryK

+0

Merci pour le conseil. Le problème est résolu, la prochaine fois je serai sûr de faire écho à la requête. Cheers mec, Archie – archiebald

1

Vous définissez $count = 1 au début de chaque itération de boucle, puis testez si $count == 1 alors votre SQL a probablement un ET supplémentaire à la fin.

0

il semble que le nombre de $ est toujours 1 dans la boucle foreach, si vous vous retrouvez avec une fuite et

+0

Merci pour le conseil, le problème est résolu, c'était ce problème et celui ci-dessus. Ne pouvait cocher qu'une seule réponse. Cheers mec, Archie – archiebald

0

est pas là une erreur ici?

SELECT DISTINCT tg_id COUNT(*) AS nb 

Vous devriez avoir un « » entre tg_id et COUNT (*)

Si l'erreur ne vient pas d'ici, pourriez-vous s'il vous plaît faire écho à vos requêtes SQL et nous donner le résultat?