Page 1 sur 1
Requête MySQL qui retourne pas ce que j'attend
Publié : 28 mai 2005, 21:29
par calimo
Soit la requête SQL suivante :
Voici ce que ça retourne si je fais un print_r (ou un simple print) :
Il y a bien des données dans la table, c'est bien la bonne table (si je change quoi que ce soit pour le rendre faux ça retourne bien une erreur) et avec les bons champs (idem ça retourne une erreur si je mets une faute) donc je ne comprend pas pourquoi ça ne retourne pas un tableau avec les résultats attendus
Quelqu'un saurait m'aider ?
Publié : 28 mai 2005, 21:41
par Thomas
Doc PHP mysql_query a écrit :Valeurs de retour
Pour les requêtes du type
SELECT, SHOW, DESCRIBE ou EXPLAIN, mysql_query() retournera
une ressource en cas de succès, et FALSE en cas d'erreur.
Pour les autres types de requêtes, UPDATE, DELETE, DROP, etc., mysql_query() retourne TRUE en cas de succès et FALSE en cas d'erreur.
La ressource de résultat retournée
doit être passée à la fonction
mysql_fetch_array(), et
les autres fonctions permettant d'explorer le résultat des tables, pour accéder aux données retournées.
les autres fonctions sont entre autres mysql_fetch_row() et mysql_fetch_assoc()
Publié : 28 mai 2005, 22:15
par calimo
Arf, c'est bien ce que je pensais, c'est encore plus compliqué que ce que je pensais
Merci, j'ai réussi à m'en sortir :
Code : Tout sélectionner
$result = mysql_query('SELECT chemin FROM ' . $mysql_table);
if (!$result) {
echo 'Impossible d\'exécuter la requête : ' . mysql_error();
exit;
}
while($exist = mysql_fetch_row($result)) {
if ($exist["0"]==$chemin) exit('Un fichier portant le même nom a été déjà enregistré dans la base de données. Passez par le menu édition.');
}
8)
Publié : 28 mai 2005, 23:02
par chBok
calimo a écrit :Arf, c'est bien ce que je pensais, c'est encore plus compliqué que ce que je pensais
Mais non, ce n'est pas compliqué du tout
Pour te faire réfléchir, voici ton code optimisé :
Code : Tout sélectionner
$result = mysql_query("SELECT chemin FROM $mysql_table WHERE chemin='$chemin'") or die('Impossible d\'exécuter la requête : ' . mysql_error());
if (mysql_num_rows($result)>0)
exit('Un fichier portant le même nom a été déjà enregistré dans la base de données. Passez par le menu édition.');
Publié : 28 mai 2005, 23:40
par Benoit
Heu c'est pas de l'optimisation ça c'est du tournage en bourrique
Par exemple, pourquoi utiliser "die" dans une ligne et "exit" dans l'autre alors que ça fait la même chose ? Pourquoi en cas d'erreur renvoyer du texte et pas du HTML ? Et si tu avais commencé à afficher quelque chose avant ça va être joli tiens...
Publié : 28 mai 2005, 23:52
par chBok
Benoit a écrit :Heu c'est pas de l'optimisation ça c'est du tournage en bourrique
Par exemple, pourquoi utiliser "die" dans une ligne et "exit" dans l'autre alors que ça fait la même chose ? Pourquoi en cas d'erreur renvoyer du texte et pas du HTML ? Et si tu avais commencé à afficher quelque chose avant ça va être joli tiens...
Je suis d'accord avec Benoit, mais j'ai juste optimisé le code tel qu'il était à l'origine... J'aurais en effet pu apporter les mêmes commentaires que Benoit
die et
exit ont pour seul but d'arrêter le traitement PHP, le navigateur recevant alors la page en l'état, et souvent, sans être finie ! Ces fonctions ne doivent être utilisées que pour du développement !
Publié : 29 mai 2005, 08:09
par calimo
chBok a écrit :Pour te faire réfléchir, voici ton code optimisé :
Code : Tout sélectionner
$result = mysql_query("SELECT chemin FROM $mysql_table WHERE chemin='$chemin'") or die('Impossible d\'exécuter la requête : ' . mysql_error());
if (mysql_num_rows($result)>0)
exit('Un fichier portant le même nom a été déjà enregistré dans la base de données. Passez par le menu édition.');
Ah oui pas mal comme ça ça ne retourne qu'un seul résultat... le bon ! J'y avais pensé sans trop y penser ni savoir comment faire exactement
Benoit a écrit :Pourquoi en cas d'erreur renvoyer du texte et pas du HTML ? Et si tu avais commencé à afficher quelque chose avant ça va être joli tiens...
Parce que
- Il n'y a rien d'affiché avant (normalement
) - Vu que c'en est aux premiers balbutiements je n'ai pas jugé utile de déjà mettre du HTML vu que c'est encore (de moins en moins) bourré d'erreurs et donc constamment découpé, changé etc.

chBok a écrit :
die et
exit ont pour seul but d'arrêter le traitement PHP, le navigateur recevant alors la page en l'état, et souvent, sans être finie ! Ces fonctions ne doivent être utilisées que pour du développement !
Et en "production" il faut utiliser quoi ?

Publié : 29 mai 2005, 08:26
par Thomas
En production
trigger_error est de plus en plus utilisé mais je m'en suis jamais servi

Il faudra que je m'y mette.
Là dernière fois que j'ai du codé quelquechose pour les erreurs (il y a + d'1 an

) il me semble que j'avais fait comme ça :
Ma page comprenait au dbut un include pour un header et en bas un include pour un footer. Quand j'avais une erreur critique je crois que je l'affichais quand même mais suivi d'un include du footer comme ça la page était quand même bien formée normalement
C'est très sale comme solution AMHA. D'ailleurs je voudrais connaître les meilleurs "trucs" à faire sur une staiton de dev. Personnellement, la première chose que je fais c'est un error_reporting(E_ALL); (et sur des scripts du net, c'est souvent moche).
Publié : 29 mai 2005, 12:11
par Benoit
Moi j'utilise bêtement des blocs if et else
Si la requête a échoué par exemple, bah je ne rentre pas dans le bloc d'affichage des résultats et je continue (en général il n'y a rien après en fait). On peut aussi faire la condition inverse (if !$result) si les traitements sont longs et qu'on préfère placer la gestion d'erreurs prèsde la condition.
Code : Tout sélectionner
if ($result = mysql_query($query) {
// fait quelque chose avec le résultat
}
else {
// affiche une erreur
}
etc.
Dans le cas où il y a une gestion d'erreurs complexe (plusieurs erreurs en cascade que je veux traiter), j'utilise un tableau appelé "erreurs", l'avantage est qu'un "if" sur un tableau vide retourne "false", donc on peut faire un if($erreurs) à tout moment.
Enfin, il y a depuis peu moyen d'utiliser des exceptions en PHP, même si ça rend parfois le code plus illisible qu'autre chose à mon avis (il y avait une note intéressante là-dessus sur le blog de Raymond Chen)
Publié : 29 mai 2005, 13:35
par Thomas
Benoit a écrit :Dans le cas où il y a une gestion d'erreurs complexe (plusieurs erreurs en cascade que je veux traiter), j'utilise un tableau appelé "erreurs", l'avantage est qu'un "if" sur un tableau vide retourne "false", donc on peut faire un if($erreurs) à tout moment.
J'utilisais un tableau aussi dans ces cas là mais je ne me souviens plus comment je le testais. un if($erreurs) ne renvoie même pas une notice ? (cf. les erreurs renvoyées par PHP).
Benoit a écrit :Enfin, il y a depuis peu moyen d'utiliser des exceptions en PHP, même si ça rend parfois le code plus illisible qu'autre chose à mon avis (il y avait une note intéressante là-dessus sur le blog de Raymond Chen)
C'est qui lui ?

Publié : 29 mai 2005, 17:01
par Benoit
Pourquoi y aurait-il une notice alors que c'est fait exprès ?
Raymond Chen est
le programmeur de Microsoft qui les empêche de faire trop de bêtises en matière de compatibilité ascendante

(Malheureusement il n'a jamais travaillé sur IE.) Son blog est très intéressant pour comprendre le pourquoi du comment de certaines choses bizarres.
L'article dont je parlais était :
http://blogs.msdn.com/oldnewthing/archi ... 52949.aspx
Publié : 30 mai 2005, 21:21
par calimo
Toto a écrit :En production
trigger_error est de plus en plus utilisé mais je m'en suis jamais servi

Il faudra que je m'y mette.
En fait le problème c'est que ça n'interrompt pas le script...
En plus ça affiche la ligne et le fichier où il y a une erreur, c'est pas du tout ce que je veux ! Je voudrais juste que ça dise à l'utilisateur "hélà, tu ne peux pas faire ça !"
Benoit a écrit :Moi j'utilise bêtement des blocs if et else

L'idée d'imbriquer une dizaine de blocs de ce genre me laisse assez perplexe, je n'ai pas l'impression que ça simplifie quoi que ce soit
