Page 1 sur 1
mysql_fetch_assoc après un mysql_result ?
Posté : 09 mai 2008, 16:48
par SpintroniK
Bonjour,
J'ai besoin d'obtenir l'id du dernier enregistrement d'une requête pour l'insérer dans une autre requête, je fais donc ceci :
$lid = mysql_result($r, $sujets_par_page-1, 'id');
et ensuite dans l'autre requête j'utilise $lid.
Mon problème c'est que suit une autre requête qui doit utilise $r, résultat de mysql_query() utilisé précédemment, mais traité par mysql_result donc ça ne fonctionne pas...
Ma question est donc : Comment faire pour utiliser successivement un mysql_result puis un mysql_fetch_assoc sur une même requête sans avoir à l'exécuter une seconde fois (la requête étant plutôt longue) ?
Merci d'avance.
Posté : 09 mai 2008, 16:50
par agité
J'ai besoin d'obtenir l'id du dernier enregistrement d'une requête pour l'insérer dans une autre requête
mysql_insert_id() :
http://fr3.php.net/manual/fr/function.m ... ert-id.php
mysql_insert_id() retourne le dernier identifiant généré par un champ de type AUTO_INCREMENT, sur la connexion MySQL courante ou sûr la connexion spécifiée par link_identifier .
Posté : 09 mai 2008, 16:55
par SpintroniK
Ca marche pas, ma requête ne fait pas d'INSERT INTO...
Posté : 10 mai 2008, 11:46
par Louisss
Salut.
Si j'ai bien compris, ton problème c'est que tu veux utiliser mysql_result(), puis mysql_fetch_assoc() non seulement sur la même requête, mais aussi sur le même enregistrement, c'est bien ça ?
Dans ce cas, après ton
il faut que tu place le pointeur sur le même enregistrement, avec mysql_data_seek(), je pense. A priori, ça devrait donner quelque chose comme ça :
Ensuite, tu n'as plus qu'à mettre ton mysql_fetch_assoc().
Posté : 10 mai 2008, 11:59
par SpintroniK
Ensuite, tu n'as plus qu'à mettre ton mysql_fetch_assoc().
Je serai plutôt tenté par essayer ça :
mysql_data_seek($r, 0, 'id');
mais je vais essayer les deux pour voir...
EDIT C'est bon, ça fonctionne avec ça, (mysql_data_seek($r, 0, 'id');) merci.
Posté : 10 mai 2008, 12:51
par Louisss
mysql_data_seek() n'a que 2 paramètres, donc inutile de tenter d'en mettre 3...
D'autre part, si tu met 0 comme deuxième paramètre de mysql_data_seek(), tu tomberas sur le premier enregistrement. Si tu n'as pas utilisé mysql_fetch_... auparavant, ça ne présente aucun intérêt puisque tu es déjà sur le premier enregistrement.
Ce que je te proposais avec ce bout de code, c'était de placer le fetch sur l'enregistrement qui a été manipulé juste avant par mysql_result().
Posté : 10 mai 2008, 14:24
par SpintroniK
Oui, j'en ai mis deux des arguments, je me suis emmêlé les pinceaux dans le post précédent.
Donc en fait mysql_data_seek($r, 0) fonctionne car ce que je veux c'est après le mysql_result($r, 20, 'id'); pouvoir faire un fetch...
Posté : 10 mai 2008, 14:27
par orgerix
Je pense que ce n'est pas utile.
En gros, avec mysql_result(), tu récupère l'information que tu veux, sans déplacer le pointeur. Donc si tu n'as pas encore fait de mysql_fetch_qqc, le pointeur est toujours au début.
Posté : 10 mai 2008, 14:46
par Sékiltoyai
Question idiote surement, mais si tu veux récupérer le dernier enregistrement, c'est à dire celui à l'id le plus grand, pourquoi ne pas faire directement un "SELECT id FROM nom_table ORDER BY id DESC LIMIT 1;" et t'épargner les data_seek et consors ?
Posté : 10 mai 2008, 15:29
par SpintroniK
@ orgerix : si justement, on dirait bien que mysql_result déplace le pointeur...
@ Sékiltoyai : C'est-à-dire que j'ai une requête du type "SELECT id FROM nom_table ORDER BY id DESC LIMIT n, n+m;" et je voudrais récupérer l'id le plus grand et le plus petit, et ensuite, je doit faire un fetch... mais là, j'ai le choix entre deux codes :
($r contenant le mysql_query de ma requête, que je ne poste pas car elle est très longue, mais si vous voulez la voir, je peux la mettre)
1] ($end ne dépassera pas 50...)
$end = ($num_ms>$sujets_par_page)? $sujets_par_page:$num_ms;
$MaxId = 0;
$MinId = 0;
$cid = 0;
for($i=0; $i<$end; $i++)
{
$cid = mysql_result($r, $i, 'id');
if($MaxId < $cid) $MaxId = $cid;
if($i==0) $MinId=$MaxId;
if($MinId>$cid) $MinId = $cid;
}
mysql_data_seek($r, 0);
2]
$req_m = mysql_query("SELECT MAX(id), MIN(id) FROM table WHERE ...");
list($MaxId,$MinId) = mysql_fetch_row($req_m);
avec les mêmes conditions pour les WHERE des deux requêttes.
Les deux solutions fonctionnent mais en faisant des bench, j'ai l'impression que la première est plus rapide...
Qu'est-ce que vous en pensez ?
J'ai aussi pensé à une troisième solution qui consisterait à récupérer directement le MAX(id) et MIN(id) dans la première requête qui est du type : "SELECT * FROM table WHERE ... ODER BY id DESC LIMIT n,n+m" mais sans succès... même en utilisant des trucs avec GROUP BY ...[/php]
Posté : 10 mai 2008, 17:27
par Sékiltoyai
Avec un index sur la colonne id, la seconde solution est sensé être de loin plus rapide.
Posté : 10 mai 2008, 17:58
par SpintroniK
Et plus courte à écrire, id est en clé primaire...
Posté : 10 mai 2008, 18:11
par Sékiltoyai
A la limite tu peux essayer un EXPLAIN de tes 2 requètes pour voir comment il va utiliser les index…
Posté : 10 mai 2008, 19:22
par caroube
Les deux solutions fonctionnent mais en faisant des bench, j'ai l'impression que la première est plus rapide...
Qu'est-ce que vous en pensez ?
Et c'est quoi la différence de temps ?
Posté : 10 mai 2008, 22:15
par SpintroniK
Je ne sais pas comment on se sert de explain, j'essayerai demain...
La différence de temps est très faible mais en moyenne il y a une différence de 0.03 sec par appel, je sais c'est pas énorme... mais finalement, je préfère opter pour l'autre solution, ça fait une requête en plus mais c'est quand même plus propre.