arnö Posted April 2, 2007 Posted April 2, 2007 Bonjour, Je me trouve façe à un problème qui me laisse perplexe : J'ai développé une petite application qui permet à des clients de faire des demandes d'expédition à partir d'une interface personnalisée. Ces demandes sont stockées et affichées dans une administration. Une page de cette administration me permet d'afficher les résultats en fonction de critères de tri (grace à des déroulants). Tout fonctionne très bien,sauf pour un champ ou ça fonctionne... à moitié. Les variables de tri sont passées en $_GET et la requête est construite en fonction de ces variables : if ($_GET['raz']=='1'){$query = 'SELECT * FROM expe WHERE nom_expe!="<b>MAJ STOCK</b>" AND dateenvoi between "'.$debut_mois.'" AND "'.$demain.'"';}else{$query = 'SELECT * FROM expe WHERE 1 AND nom_expe!="<b>MAJ STOCK</b>"';$tab_ch=array('produits','modexpe','dept', 'transporteur','traitement','traitement_im','traitement_livraison');foreach($tab_ch as $k=>$v) { if($_GET[$v]!=(''||'0')){ $query.=' AND '.$v.' LIKE "'.$_GET[$v].'%"'; }} if ($_GET['sansdate']!='sansdate') { if (($_GET['datedebut']=='Clique ici')||($_GET['datedebut']=='')){ $query.= ' AND dateenvoi between "'.$debut_mois.'"'; }else{ $query.= ' AND dateenvoi between "'.$_GET['datedebut'].'"'; } if (($_GET['datefin']=='Clique ici')||($_GET['datefin']=='')){ $query.= ' AND "'.$demain.'"'; }else{ $query.= ' AND "'.$_GET['datefin'].'"'; } if ($_GET['tri']!=''){ $query.= ' ORDER BY '.$_GET['tri']; }else{ $query.= ' ORDER BY dateenvoi DESC'; } }else{ if ($_GET['tri']!=''){ $query.= ' ORDER BY '.$_GET['tri']; }else{ $query.= ' ORDER BY dateenvoi DESC'; } }} Le problème apparait avec la variable traitement_im (qui peut avoir trois état : "à traiter", "traité", "enlevé"): Lorsque la requête (que j'affiche après l'avoir construite) est : SELECT * FROM expe WHERE 1 AND nom_expe!="MAJ STOCK" AND traitement_imprim LIKE "enlevé%" ORDER BY dateenvoi DESC le résultats sont bien retournés, mais... lorsque la requête est SELECT * FROM expe WHERE 1 AND nom_expe!="MAJ STOCK" AND traitement_imprim LIKE "traité%" ORDER BY dateenvoi DESC ou SELECT * FROM expe WHERE 1 AND nom_expe!="MAJ STOCK" AND traitement_imprim LIKE "à traiter%" ORDER BY dateenvoi DESC aucun résultats ne sont retournés, alors qu'ils devraient y en avoir ! Les deux requêtes passées directement dans phpMyAdmin retourne bien des résultats... J'avoue que je n'y comprend rien... Merci d'avance de me donner votre avis
georges Posted April 2, 2007 Posted April 2, 2007 salut, je ne sais pas si ma réponse va t'aider mais il m'est arrivé un truc du même acabit et je me suis rendu compte qu'il fallait mettre des "quotes" (je ne sais plus comment on nomme ça ) pour que cela fonctionne et donc écrire par exemple : $requete = "SELECT * FROM `expe` WHERE ..."; au lieu de $requete = "SELECT * FROM expe WHERE ... ";
Vincent Posted April 2, 2007 Posted April 2, 2007 Etant donné que tu utilises des accents, je pense que tu as un problème dans l'encodage des caractères. D'un coté, tu travailles en UTF-8, de l'autre pas. Php, MySQL & UTF-8 sont dans un bateau
arnö Posted April 3, 2007 Author Posted April 3, 2007 Merci à vous deux pour vos réponses, @ Georges : j'ai essayé d'encadrer les noms de champs et de la table avec `, mais celà ne change rien... @ Vincent : J'avais pensé à ça aussi, mais il me semblait que puisque "enlevé" fonctionne, celà ne pouvait pas venir d'un problème d'accent et d'encodage... mais je vais creuser Merci en tout cas de votre aide
arnö Posted April 3, 2007 Author Posted April 3, 2007 Vincent, j'ai essayé plusieurs truc avec le codage utf8 mais sans succès : -j'encode la requête en UTF8 avant de l'exécuter, ce qui donne SELECT * FROM expe WHERE 1 AND nom_expe!="MAJ STOCK" AND traitement_imprim LIKE "enlevé%" AND dateenvoi between "2007-04-01" AND "2007-04-04" ORDER BY dateenvoi DESC mais ça ne fonctionne pas (en fait, celà ne fonctionne plus non plus pour la requête qui fonctionnais au début...) -j'ai rajouté à ma séquence de connexion à la base : mysql_query("SET NAMES 'utf8'"); là non plus pas de résultat si ce n'est que la coloration des lignes du tableau de résultats en fonction du traitement_im ne fonctionne plus... - j'ai ensuite essayé de changer l'encodage de mon champ dans la base : il s'agit d'un champ ENUM avec trois valeurs, en latin_swedish_ci. Impossible de passer en uf8... lorsque je change, et que je valide, ça reviens invariablement sur latin_swedish_ci. D'autres idées pour me mettre sur la piste ?
Leonick Posted April 5, 2007 Posted April 5, 2007 la solution quand la requête ne fonctionne pas, c'est de la faire afficher avant son exécution (soit à l'écran soit dans un fichier texte) et ensuite de faire exécuter cette commande dans phpmyadmin c'est là où on s'aperçoit que la requête effectuée n'est pas celle que l'on voulait.
arnö Posted April 6, 2007 Author Posted April 6, 2007 Salut Leonick, C'est exactement ce que je faisais depuis le début (afficher la requête sur ma page de résultat), et c'est ça qui me chiffonais le plus : la requête copiée et collée dans PhpMyAdmin retournais des résultats... Mais je viens de trouver mon erreur, grace à toi : Je stocke des mise à jour de stock dans la table expédition, et pour les distinguer, je leur donne comme nom "<b>MAJ STOCK</b>". Donc la requête est du type $query = 'SELECT * FROM expe WHERE nom_expe!="<b>MAJ STOCK</b>" AND dateenvoi between "'.$debut_mois.'" AND "'.$demain.'"'; elle ne me retourne pas de résultat (et c'est normal !!!) lorsque j'affiche cette requête, les balise html sont interprétés et celà donne SELECT * FROM expe WHERE nom_expe!="MAJ STOCK" AND dateenvoi between "2007-04-01" AND "2007-04-06" qui elle me retourne des résultats... Bref, une belle boulette de débutant voilà voilà merci à vous...
Recommended Posts
Please sign in to comment
You will be able to leave a comment after signing in
Sign In Now