Php/mysql - query improbable (where and)

Résolu
Bonjour,

Ce matin, j'ai pu me faire aider pour la définition de mes variables dans ma requête (requête php > mysql pour interroger une db en fonction du contenu des champs dans un formulaire html (méthode post).

La requête passe bien quand on prend les champs 1 par 1, par exemple avec ceci:

$query = "SELECT * FROM marginalia WHERE margindex LIKE '%".$margindex."%' ORDER BY margindex";


Mais ça coince lorsque je veux les combiner, comme ceci :

$query = "SELECT * FROM marginalia WHERE margindex LIKE '%".$margindex."%'
AND nota LIKE '%".$nota."%'
AND nota_var LIKE '%".$nota_var."%'
AND ref_txt LIKE '%".$ref_txt."%'
AND v_v LIKE '%".$v_v."%'
AND nombre LIKE '%".$nombre."%'
AND main LIKE '%".$main."%'
ORDER BY margindex";


Pourquoi la combinaison des critères n'appelle-t-elle donc aucun résultat ?

Merci d'avance !

mysql_connect (etc...)
mysql_select_db (etc...)

$margindex = mysql_real_escape_string($_POST['margindex']);
$nota = mysql_real_escape_string($_POST['nota']);
$nota_var = mysql_real_escape_string($_POST['nota_var']);
$nota_sup = mysql_real_escape_string($_POST['nota_sup']);
$ref_txt = mysql_real_escape_string($_POST['ref_txt']);
$ref_1601 = mysql_real_escape_string($_POST['ref_1601']);
$t_suj = mysql_real_escape_string($_POST['t_suj']);
$lien = mysql_real_escape_string($_POST['lien']);
$n_suj = mysql_real_escape_string($_POST['n_suj']);
$v_v = mysql_real_escape_string($_POST['v_v']);
$nombre = mysql_real_escape_string($_POST['nombre']);
$main = mysql_real_escape_string($_POST['main']);
$commentaire = mysql_real_escape_string($_POST['commentaire']);

$query = "SELECT * FROM marginalia WHERE margindex LIKE '%".$margindex."%'
AND nota LIKE '%".$nota."%'
AND nota_var LIKE '%".$nota_var."%'
AND ref_txt LIKE '%".$ref_txt."%'
AND v_v LIKE '%".$v_v."%'
AND nombre LIKE '%".$nombre."%'
AND main LIKE '%".$main."%'
ORDER BY margindex";


$result = mysql_query($query) OR die(mysql_error());


echo (etc...)


5 réponses

Résumé de la discussion

La problématique porte sur une requête PHP/MySQL utilisant plusieurs clauses LIKE liées par AND pour interroger une base en fonction du contenu des champs d'un formulaire HTML (méthode POST). En cas de sélection groupée, des valeurs vides ou 'empty' dans des menus déroulants faisaient échouer la requête en filtrant inutilement les critères, ce qui produisait zéro résultat. La solution efficace consiste à envoyer une chaîne vide pour les champs non renseignés, afin que LIKE '%%' puisse retourner toutes les entrées, ou alternativement à omettre ces conditions. Le fil de discussion montre que remplacer les valeurs 'empty' par une valeur vide dans les options des menus déroulants résout le problème et évite d’altérer les conditions de filtrage.

Bobot (l’IA à votre service)
  1. et as tu essayer ta requête en brut? je veut dire par la, sans passer par le php, directement dans ton éditeur sql?
    1. Oui, la requête en brut est OK dans l'éditeur car je dois remplacer '%".$margindex."%' et autres par les valeurs demandées. Ici, c'est le fait de combiner les termes de recherches de plusieurs champs de mon formulaire qui pose problème.
    2. ok, alors essaye de faire ça:

      ajoute un echo $query; juste après ta requête, et test cette requête tel quel dans ton éditeur sql
    3. ><
      Ca marche pas, erreur de syntaxe 1064.
    4. et voila d'ou vient l'erreur ^^

      montre nous ce que retourne le echo.
    5. Lorsque j'exécute ceci dans l'éditeur :

      SELECT * 
      FROM marginalia 
      WHERE margindex LIKE '%".$margindex."%'
      AND nota LIKE '%".$nota."%'
      AND nota_var LIKE '%".$nota_var."%'
      AND ref_txt LIKE '%".$ref_txt."%'
      AND v_v LIKE '%".$v_v."%'
      AND nombre LIKE '%".$nombre."%'
      AND main LIKE '%".$main."%'
      ORDER BY margindex;
      echo $query;
      


      J'obtiens ceci :
      Erreur
      
      requête SQL:
      
      echo $query;
      
      MySQL a répondu: Documentation
      #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'echo $query' at line 1
      


      J'ai peut-être mal interprété ce que tu me conseillais de faire. :-/
  2. Au passage, a la place de tous tes mysql_real_escape_string mets ça, tu gagneras de la place ;)

    foreach ($_POST as $k=>$v) {
    	$$k = mysql_real_escape_string($v);
    }
    1. Cool, merci. Je cherchais un truc du genre ce midi, en vain.
      ;-)

      (Pour mon info perso : pourquoi les lettres k et v ?)
    2. k pour key
      v pour value

      Dans les exemples c'est souvent k et v ou key et val.
  3. teste si tes variables php ne sont pas vides avant d'executer la requete
    exple: if((!empty($margindex))and..... )
    {

    //ta requete
    }
    1. sa reviens a faire un echo de sa requete ^^
    2. Il me dit que la query est vide, alors que j'ai envoyé les valeurs exactes d'un enregistrement à rechercher. :-s
      Quand je mets des * partout, il me retourne uniquement les titres des colonnes, tableau vide.
    3. D'un autre côté, * n'est pas un métacaractère en SQL, donc ça c'est normal. Mets % plutôt.
    4. C'était dans le formulaire html. Avec * ou %, j'obtiens la même chose.
  4. Bonjour,

    Tu es sûr que tu ne voudrais pas des OR à la place des AND ?

    Xavier
    1. Oui, des AND.
      (J'ai qd-même essayé avec OR, mais ça rend la même chose : rien.)
  5. Bonjour,

    est tu sur qu'il existe au moins une ligne que ta requête peut retourner?
    1. Oui, j'ai testé beaucoup de possibilités.