Aller au contenu

Requête qui fonctionne dans phpMyAdmin mais pas en PHP...


arnö

Sujets conseillés

Bonjour,

Je me trouve façe à un problème qui me laisse perplexe :wacko: :

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

Lien vers le commentaire
Partager sur d’autres sites

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 :P ) pour que cela fonctionne et donc écrire par exemple :

$requete = "SELECT * FROM `expe` WHERE ...";

au lieu de

$requete = "SELECT * FROM expe WHERE ... ";

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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 ?

Lien vers le commentaire
Partager sur d’autres sites

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.

Lien vers le commentaire
Partager sur d’autres sites

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 :whistling:

voilà voilà merci à vous...

Lien vers le commentaire
Partager sur d’autres sites

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...