[PHP/Mysql] Pb avec mysql_fetch_row

Pb avec mysql_fetch_row [PHP/Mysql] - PHP - Programmation

Marsh Posté le 22-09-2006 à 00:22:27    

Je pense que le probleme doit etre très simple mais bon... J'ai beau chercher ci et la des infos je comprends pas d'ou vient le probleme.
Si une bonne ame pouvait me depanner.  :jap:  
 
 
en gros je fais une requete (simplifiée, j'enleve ce qui sert a rien vis a vis du probleme) :
 
$result=@mysql_query('SELECT id FROM Galerie ORDER BY id ASC LIMIT 0,9 ;');    
 
//   je lui demande donc les 9 premieres id classé par ordre et en commencant par la premiere.
   
$tmp=@mysql_fetch_row($result);  
 
// c'est la ou ca doit clocher, je veut juste mettre les 9 resultats dans un tableau tmp, seulement quand j'y accede j'ai bien ma premiere valeur en $tmp[0] mais je n'ai pas les 8 autres...
Si quelqu'un voit ou je me plante...
 
Merci d'avance  :jap:


Message édité par korxx le 22-09-2006 à 08:36:58
Reply

Marsh Posté le 22-09-2006 à 00:22:27   

Reply

Marsh Posté le 22-09-2006 à 00:32:12    

Bon j'suis en train de faire ca d'une autre facon, mais par curiosité j'aimerais bien savoir quelle erreur j'ai fait :)
 
edit :
 
En fin de compte pour l'integration d'une option plus tard il faudra que je sache le faire, donc la question reste toujours d'actualité :jap:


Message édité par korxx le 22-09-2006 à 00:46:38
Reply

Marsh Posté le 22-09-2006 à 10:20:10    

J'ai essayé de voir si j'avais bien désalloué $tmp et $result avant mais c'est ok... Je comprends pas :/
 
Je pourrais faire une boucle et remplir $tmp[i] au fur et a mesure mais ca va me faire 9 requetes au lieu d'une seule ca me semble pas terrible...

Reply

Marsh Posté le 22-09-2006 à 10:35:02    

Relis bien le manuel de tes fonctions php, je pense que tu n'as pas bien compris comme ça fonctionnait (le prends pas mal, ça arrive).
 
mysql_fetch_row() retourne 1 ligne du résultat d'une requête. Si ta requête retourne 9 lignes, tu dois appeler 9 fois mysql_fetch_row().
 
En aucun cas ça ne veut dire que ta requête SQL sera exécutée 9 fois. La requête est seulement exécutée une fois lors de l'appel à mysql_query().
 
Faire une boucle pour traiter le résultat d'une requête ligne par ligne est la façon la plus courante de faire quand on travaille avec une base de données en php (et pas seulement en php d'ailleurs).
 

Code :
  1. $tmp = array();
  2. $result = @mysql_query('SELECT id FROM Galerie ORDER BY id ASC LIMIT 0,9 ;');
  3. if ($result !== FALSE) {
  4.   while ($row = mysql_fetch_row($result)) {
  5.     array_push($tmp, $row);
  6.   }
  7. }


 
En termes de propreté du code, y'a sans doute mieux, mais dans l'idée c'est ça.

Message cité 1 fois
Message édité par KrisCool le 22-09-2006 à 10:38:10

---------------
Loose Change Lies | Bars | Last.fm
Reply

Marsh Posté le 22-09-2006 à 10:58:02    

KrisCool a écrit :

Relis bien le manuel de tes fonctions php, je pense que tu n'as pas bien compris comme ça fonctionnait (le prends pas mal, ça arrive).
 
mysql_fetch_row() retourne 1 ligne du résultat d'une requête. Si ta requête retourne 9 lignes, tu dois appeler 9 fois mysql_fetch_row().
 
En aucun cas ça ne veut dire que ta requête SQL sera exécutée 9 fois. La requête est seulement exécutée une fois lors de l'appel à mysql_query().
 
Faire une boucle pour traiter le résultat d'une requête ligne par ligne est la façon la plus courante de faire quand on travaille avec une base de données en php (et pas seulement en php d'ailleurs).
 

Code :
  1. $tmp = array();
  2. $result = @mysql_query('SELECT id FROM Galerie ORDER BY id ASC LIMIT 0,9 ;');
  3. if ($result !== FALSE) {
  4.   while ($row = mysql_fetch_row($result)) {
  5.     array_push($tmp, $row);
  6.   }
  7. }


 
En termes de propreté du code, y'a sans doute mieux, mais dans l'idée c'est ça.


 
 
 
mmh oki, merci bcp pour ton aide  :jap:  
 
En fait quand je parlais de faire neuf requetes c'est parce que je pensais faire une boucle avec la requete mysql 9 fois mais avec la limite décallé d'un coup a chaque fois :D
 
Effectivement j'avais mal compris le fonctionnement de la fonction, merci beaucoup, ca me debloque bien  :love: .
 
 


Message édité par korxx le 22-09-2006 à 11:03:33
Reply

Marsh Posté le 22-09-2006 à 11:03:25    

par contre ton code n'a pas l'air de marcher, mais au moins je sais d'ou vient mon erreur je devrais pouvoir m'en sortir maintenant  :)
 

Message cité 1 fois
Message édité par korxx le 22-09-2006 à 11:13:20
Reply

Marsh Posté le 22-09-2006 à 11:12:54    

korxx a écrit :

par contre ton code n'a pas l'air de marcher, mais au moins je sais d'ou vient mon erreur je devrais pouvoir m'en sortir maintenant  :)


 
Ah ?  [:guts]  
Bon bah si quelqu'un voit pourquoi... j'ai pas php sous la main, donc je peux pas trop faire un test rapide.


---------------
Loose Change Lies | Bars | Last.fm
Reply

Marsh Posté le 22-09-2006 à 11:13:13    

KrisCool a écrit :

Ah ?  [:guts]  
Bon bah si quelqu'un voit pourquoi... j'ai pas php sous la main, donc je peux pas trop faire un test rapide.


 
 
il remplit tout mon tableau avec array  :pt1cable:
 
edit : enfin je parle litteralement, si je fais echo $tmp[0] ca renvoit array
 
 

Message cité 1 fois
Message édité par korxx le 22-09-2006 à 11:14:01
Reply

Marsh Posté le 22-09-2006 à 11:25:33    

korxx a écrit :

il remplit tout mon tableau avec array  :pt1cable:
 
edit : enfin je parle litteralement, si je fais echo $tmp[0] ca renvoit array


 
Oui ça c'est parfaitement normal. mysql_fetch_row() renvoie un tableau (c'est écrit dans la doc).
Chaque élément du tableau $tmp est donc lui aussi un tableau.


---------------
Loose Change Lies | Bars | Last.fm
Reply

Marsh Posté le 22-09-2006 à 11:32:33    

KrisCool a écrit :

Oui ça c'est parfaitement normal. mysql_fetch_row() renvoie un tableau (c'est écrit dans la doc).
Chaque élément du tableau $tmp est donc lui aussi un tableau.


 
 
si j'ai bien compris, mysql_fetch_raw me renvoit un tableau d'une seule colonne, une seule ligne (dans mon cas) avec un ID
il ne peut pas me renvoyer un tableau avec toutes mes ids alors je le boucle pour remplir un tableau d'adresse de tableau a 1 element.
 
Ca me semble un peu tordu :( (mais j'ai compris)
 
ca fait un double adressage a chaque acces, c'est pas super optimisé :/
 
 
ou alors je suis encore en train de raconter des conneries  [:ddr555]

Message cité 1 fois
Message édité par korxx le 22-09-2006 à 11:33:53
Reply

Marsh Posté le 22-09-2006 à 11:32:33   

Reply

Marsh Posté le 22-09-2006 à 11:44:58    

korxx a écrit :

si j'ai bien compris, mysql_fetch_raw me renvoit un tableau d'une seule colonne, une seule ligne (dans mon cas) avec un ID
il ne peut pas me renvoyer un tableau avec toutes mes ids alors je le boucle pour remplir un tableau d'adresse de tableau a 1 element.
 
Ca me semble un peu tordu :( (mais j'ai compris)


 
Tordu... c'est ton point de vue, après faut voir que tu es dans un cas particulier avec une requête qui renvoie des lignes à 1 colonne. mysql_fetch_row() est fait pour fonctionner dans tous les cas et avoir un comportement cohérent, donc qu'il y ait une ou plusieurs colonnes dans les lignes du résultat, il renvoie un tableau.
 

Citation :

ca fait un double adressage a chaque acces, c'est pas super optimisé :/


Très honnêtement, l'optimisation elle se joue pas là. Quand tu bosses avec des bases de données, l'optimisation c'est généralement d'abord faire des requêtes bien faites. La récupération du résultat par php, à côté du temps d'exécution de la requête, généralement c'est peanuts.
 
Priorité numéro 1 : faire du code clair qui fonctionne.
 
Pour ton cas, vu qu'on n'utilise que l'unique colonne du résultat de la requête, mon code de tout à l'heure devient le suivant:
 

Code :
  1. $tmp = array();
  2. $result = @mysql_query('SELECT id FROM Galerie ORDER BY id ASC LIMIT 0,9 ;');
  3. if ($result !== FALSE) {
  4.     while ($row = mysql_fetch_row($result)) {
  5.         array_push($tmp, $row[0]);
  6.     }
  7. }


 
Au lieu de mettre $row dans le tableau $tmp, on met juste $row[0] qui correspond à la première colonne, c'est à dire ton index. J'avais zappé ce détail à l'origine ;)


---------------
Loose Change Lies | Bars | Last.fm
Reply

Marsh Posté le 22-09-2006 à 11:50:34    

KrisCool a écrit :

Tordu... c'est ton point de vue, après faut voir que tu es dans un cas particulier avec une requête qui renvoie des lignes à 1 colonne. mysql_fetch_row() est fait pour fonctionner dans tous les cas et avoir un comportement cohérent, donc qu'il y ait une ou plusieurs colonnes dans les lignes du résultat, il renvoie un tableau.
 

Citation :

ca fait un double adressage a chaque acces, c'est pas super optimisé :/


Très honnêtement, l'optimisation elle se joue pas là. Quand tu bosses avec des bases de données, l'optimisation c'est généralement d'abord faire des requêtes bien faites. La récupération du résultat par php, à côté du temps d'exécution de la requête, généralement c'est peanuts.
 
Priorité numéro 1 : faire du code clair qui fonctionne.
 
Pour ton cas, vu qu'on n'utilise que l'unique colonne du résultat de la requête, mon code de tout à l'heure devient le suivant:
 

Code :
  1. $tmp = array();
  2. $result = @mysql_query('SELECT id FROM Galerie ORDER BY id ASC LIMIT 0,9 ;');
  3. if ($result !== FALSE) {
  4.     while ($row = mysql_fetch_row($result)) {
  5.         array_push($tmp, $row[0]);
  6.     }
  7. }


 
Au lieu de mettre $row dans le tableau $tmp, on met juste $row[0] qui correspond à la première colonne, c'est à dire ton index. J'avais zappé ce détail à l'origine ;)


 
 
quand je disais tordu je voulais dire que c'etait dommage de passer par un double adressage pour rien, par contre avec ton nouveau code c'est parfait, j'ai relu le fonctionnement des diverses fonctions dans le manuel php (array et mysql_fetch_row) et effectivement c'est pas si tordu, ca marche dans tous les cas, c'est juste la facon dont on l'utilisait qui convenait pas.
 
En tout cas merci bcp pour ta patience  :jap:  

Reply

Marsh Posté le 22-09-2006 à 20:20:31    

coucou korxx !

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed