mysql_fetch_assoc après un mysql_result ?

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : mysql_fetch_assoc après un mysql_result ?

par SpintroniK » 10 mai 2008, 22:15

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.

par caroube » 10 mai 2008, 19:22

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 ?

par Sékiltoyai » 10 mai 2008, 18:11

A la limite tu peux essayer un EXPLAIN de tes 2 requètes pour voir comment il va utiliser les index…

par SpintroniK » 10 mai 2008, 17:58

Et plus courte à écrire, id est en clé primaire...

par Sékiltoyai » 10 mai 2008, 17:27

Avec un index sur la colonne id, la seconde solution est sensé être de loin plus rapide.

par SpintroniK » 10 mai 2008, 15:29

@ 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]

par Sékiltoyai » 10 mai 2008, 14:46

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 ?

par orgerix » 10 mai 2008, 14:27

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.

par SpintroniK » 10 mai 2008, 14:24

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...

par Louisss » 10 mai 2008, 12:51

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().

par SpintroniK » 10 mai 2008, 11:59

Code : Tout sélectionner

mysql_data_seek($r, $sujets_par_page-1);
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.

par Louisss » 10 mai 2008, 11:46

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

Code : Tout sélectionner

$lid = mysql_result($r, $sujets_par_page-1, 'id');
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 :

Code : Tout sélectionner

mysql_data_seek($r, $sujets_par_page-1);
Ensuite, tu n'as plus qu'à mettre ton mysql_fetch_assoc().

par SpintroniK » 09 mai 2008, 16:55

Ca marche pas, ma requête ne fait pas d'INSERT INTO...

par agité » 09 mai 2008, 16:50

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 .

mysql_fetch_assoc après un mysql_result ?

par SpintroniK » 09 mai 2008, 16:48

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.