Requête MySQL qui retourne pas ce que j'attend

HTML5, CSS3, Javascript, support des mobiles... Que penser de votre site ? Vous manquez d'informations pour la construction d'un site qui puisse s'afficher correctement partout ? C'est un problème simple, un peu complexe ? Venez ici !
Répondre
calimo
Animal mythique
Messages : 14118
Inscription : 26 déc. 2003, 11:51

Requête MySQL qui retourne pas ce que j'attend

Message par calimo »

Soit la requête SQL suivante :

Code : Tout sélectionner

$exist = mysql_query('SELECT chemin FROM ' . $mysql_table);
Voici ce que ça retourne si je fais un print_r (ou un simple print) :

Code : Tout sélectionner

Resource id #5
:?

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 ?
Thomas
Varan
Messages : 1907
Inscription : 07 janv. 2004, 17:29

Message 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()
Anciennement Toto.
calimo
Animal mythique
Messages : 14118
Inscription : 26 déc. 2003, 11:51

Message 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)
chBok
Iguane
Messages : 991
Inscription : 17 oct. 2003, 19:17

Message 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 :D
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.');
Benoit
Administrateur
Messages : 4894
Inscription : 19 juil. 2003, 10:59

Message 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...
chBok
Iguane
Messages : 991
Inscription : 17 oct. 2003, 19:17

Message 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 :?

:idea: 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 !
calimo
Animal mythique
Messages : 14118
Inscription : 26 déc. 2003, 11:51

Message 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 :oops:
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
  1. Il n'y a rien d'affiché avant (normalement :lol: )
  2. 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. :wink:
chBok a écrit : :idea: 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 ? :oops:
Thomas
Varan
Messages : 1907
Inscription : 07 janv. 2004, 17:29

Message par Thomas »

En production trigger_error est de plus en plus utilisé mais je m'en suis jamais servi :oops: 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 :mrgreen: ) 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).
Anciennement Toto.
Benoit
Administrateur
Messages : 4894
Inscription : 19 juil. 2003, 10:59

Message 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)
Thomas
Varan
Messages : 1907
Inscription : 07 janv. 2004, 17:29

Message 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 ? :)
Anciennement Toto.
Benoit
Administrateur
Messages : 4894
Inscription : 19 juil. 2003, 10:59

Message 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
calimo
Animal mythique
Messages : 14118
Inscription : 26 déc. 2003, 11:51

Message par calimo »

Toto a écrit :En production trigger_error est de plus en plus utilisé mais je m'en suis jamais servi :oops: 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 :( :oops:
Répondre

Qui est en ligne ?

Utilisateurs parcourant ce forum : Aucun utilisateur inscrit et 2 invités