JeuWeb - Crée ton jeu par navigateur
Procédure stockée MYSQL - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : Procédure stockée MYSQL (/showthread.php?tid=5485)

Pages : 1 2


Procédure stockée MYSQL - Zack - 09-06-2011

Bonjour,

Ca fait depuis un bon moment que je galère à récupérer plusieurs lignes à partir d'une procédure stockée. J'arrive à récupérer seulement la dernière ligne, du coup, est ce que c'est la récupération qui doit se faire autrement que par les méthodes habituelles ou alors c'est ma procédure qui est mal construite ?

La voici :

CREATE PROCEDURE rechercheJoueur (IN minX INT, IN maxX INT, IN minY INT, IN maxY INT)
BEGIN
DECLARE done INT DEFAULT 0;
DECLARE var_idJoueur INT(11);

DECLARE i INT DEFAULT 0;

DECLARE curseur1 CURSOR FOR SELECT idJoueur
FROM joueur
WHERE x BETWEEN minX and maxX and y BETWEEN minY and maxY AND derniereActualisation > NOW() - INTERVAL 600 SECOND AND idCarte = 0;
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;

OPEN curseur1;
REPEAT
FETCH curseur1 INTO var_idJoueur;

IF NOT done THEN
SELECT var_idJoueur;
END IF;
UNTIL done
END REPEAT;
CLOSE curseur1;
END|

Et je récupère le résultat comme suit :

$req = mysql_query("CALL rechercheJoueur(10,50,10,50);");
while ($data = mysql_fetch_assoc($req)) {
echo $data['var_idJoueur'];
}

Et ça m'affiche que le dernier idJoueur.

Auriez vous une petite idée ?


RE: Procédure stockée MYSQL - Roworll - 10-06-2011

Pourquoi utiliser un curseur ?
En faisant ça, tu renvoies plusieurs recordset (1 pour chaque SELECT var_idJoueurWink
Du coup, PHP ne lit que le contenu du dernier Recordset renvoyé.

Le curseur me semble carrément inutile.


RE: Procédure stockée MYSQL - Zack - 10-06-2011

Pour récupérer plusieurs lignes d'un résultat, ils disent d'utiliser un curseur pour parcourir chaque ligne, c'est pour ça quand j'en ai mis un.

Du coup, je vais tester sans pour voir.


RE: Procédure stockée MYSQL - pascal - 10-06-2011

Le soucis n'est pas le curseur, mais l'utilisation d'une variable de type INT en retour. Cette variable est écrasée (comme dit par Roworll). Il faut utiliser une variable renvoyant une liste ou un tableau (à voir si ça existe en MySQL).

Le plan B, c'est d'utiliser une simple requête préparée.

A+

Pascal


RE: Procédure stockée MYSQL - niahoo - 10-06-2011

ou pas stockée d'ailleurs, là je vois une simple requête qui demande une valeur de x entre deux bornes, idem pour y et une valeur de temps supérieure à une borne. J'y connais pas grand chose en utilisation avancée des SGBDR mais là je ne saisis pas l'intérêt.


RE: Procédure stockée MYSQL - Zack - 11-06-2011

J'ai pas encore eu le temps de tester, je verrai ça cet aprem avec ce que vous suggérez.

Mais en fait, je vous ai montré la requête simplifiée, je retourne beaucoup plus de champs sinon, une bonne dizaine. Et cette requête est appelée toutes les 2 secondes. Elle sert à obtenir ce que font les joueurs sur une carte.

Du coup, j'aimerai gagner un peu en performance en la stockant.

Après je sais que ce qui serait le mieux ce sont les sockets, mais pour le moment, je n'ai pas encore le temps de travailler sur ça. Donc j'essai d'améliorer le système déjà existant en attendant de passer aux sockets.


RE: Procédure stockée MYSQL - Zack - 14-06-2011

Bon bah j'ai cherché plus compliqué qu'il ne fallait. Les tutos disaient pourtant d'utiliser un curseur car une procédure stockée ne pouvait pas retourner plusieurs lignes.
Et au final, j'ai testé sans et ça me retourne bien tous mes résultats.

C'était donc tout con, et fallait juste faire comme pour une requête habituelle.
Du coup, voilà ce que ça donne juste pour info :


CREATE PROCEDURE rechercheJoueur (IN minX INT, IN maxX INT, IN minY INT, IN maxY INT)
BEGIN
SELECT idJoueur
FROM joueur
WHERE x BETWEEN minX AND maxX AND y BETWEEN minY AND maxY AND derniereActualisation > NOW() - INTERVAL 600 SECOND AND idCarte = 0;
END|

Et la récupération se fait donc comme habituellement.

Merci pour vos réponses ^^


RE: Procédure stockée MYSQL - Myrina - 15-06-2011

Ce qui serait intéressant avant de clore complètement, ça serait de vérifier la différence de temps d'exécution de ta requête incluse dans la procstock ou en direct ou encore via un PDO:prepare.


RE: Procédure stockée MYSQL - Ter Rowan - 15-06-2011

ne devrait on pas remplacer le "between min and max" par " zz < max and zz >min"
on gagnerait un peu aussi non ?

mais effectivement vu la (non) complexité de la requête j'ai du mal à voir l'intérêt d'une procédure stockée par rapport à une requête préparée (maintenant je suis super loin d'etre un connaisseur bdd)


RE: Procédure stockée MYSQL - niahoo - 15-06-2011

C'est que la requête n'est parsée qu'une seule fois probablement.