Php/mysql - query improbable (where and)
RésoluCe 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
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.
-
et as tu essayer ta requête en brut? je veut dire par la, sans passer par le php, directement dans ton éditeur sql?
-
-
-
-
-
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. :-/
-
-
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); } -
teste si tes variables php ne sont pas vides avant d'executer la requete
exple: if((!empty($margindex))and..... )
{
//ta requete
} -
Bonjour,
Tu es sûr que tu ne voudrais pas des OR à la place des AND ?
Xavier -
Bonjour,
est tu sur qu'il existe au moins une ligne que ta requête peut retourner?