Poster une réponse 
 
Note de cette discussion :
  • Moyenne : 0 (0 vote(s))
  • 1
  • 2
  • 3
  • 4
  • 5
[Résolu] Optimisation script (requête SQL)
Auteur Message
Joojo Hors ligne
Membre

Messages : 81
Inscription : Jul 2007
Réputation : 2
Message : #1
[Résolu] Optimisation script (requête SQL)
Bonjour à tous avec ce jolie soleil du mois d'aout dont les rayons passent à travers ma fenêtre...quoi vous me croyez pas??.....Oui bon d'accord je ment...

Bref je vais vous présenter quelques lignes de ma création qui fonctionnent. Celui-ci est utilisé à chaque déplacement du joueur pour faire revivre les monstres qui ont été tués par les joueurs. Chaque monstre a un temps de résurrection différent. Et comme je suis Satan en personne qui ne respecte pas la Bible PHP il y a une requête dans une boucle NAN PAS TAPER 15

Sinon, petites explication: j'ai une table monstres qui contient tous les monstres différents existants (un de chaque en gros) qui contient les données de chacun. Et enfin une table map_monstres c'est à dire tous les monstres qui sont sur la map. Sur cette table chaque monstre à un id_id_monstre différent et un id_monstre pour aller chercher ses données dans la table monstres.

J'ai crut qu'il y avait déjà eu des post ici mais je pense qu'ils ont dut partir avec le ménage du printemps.

Bon voilà la bestiole:

Code PHP :
//Donc ici on va chercher tous les monstres de la case ou "atterrit" le joueur qui sont morts
$retour mysql_query('SELECT map_monstres.timestamp, monstres.temps, monstres.vie_max_monstre, monstres.exp_max_monstre, map_monstres.id_id_monstre 
        FROM monstres INNER JOIN map_membres INNER JOIN map_monstres 
        ON map_monstres.id_case = map_membres.id_case 
        AND map_membres.login_membre = "'
$_COOKIE['pseudo'] .'" 
        AND map_monstres.vie_monstre = "0" 
        AND monstres.id_monstre = map_monstres.id_monstre'
)or die(mysql_error());
        while(
$donnees mysql_fetch_array($retour))
            {
            
$id_id_monstre $donnees['id_id_monstre'];
            
$dernier_affichage $donnees['timestamp'];//La dernière fois qu'il a revécu
            
$espace $donnees['temps'];  //Le temps entre chasque resurrection
            
$vie_max_monstre $donnees['vie_max_monstre'];  
            
$exp_max_monstre $donnees['exp_max_monstre'];
            
            
$date_actuelle time();
            
            
//On soustrait la date à celle de le dernière modification de celle de la table
            
$difference $date_actuelle $dernier_affichage;
            
            if(
$difference >= $espace)
                {
                
mysql_query('UPDATE map_monstres SET vie_monstre = "'$vie_max_monstre .'", exp_monstre = "'$exp_max_monstre .'", timestamp = "'$date_actuelle .'" WHERE id_id_monstre = "'$id_id_monstre .'"')or die(mysql_error());
                }
            } 

Bref donc dans tout ça je voudrais si c'est possible ne faire qu'une requête pour faire revivre tous les monstres au lieu d'en faire une pour chacun. En gros je pense qu'il faut créer une sorte de tableau pour $vie_max_monstre, $exp_max_monstre, $date_actuelle, $id_id_monstre qui contiendrait les données de chaque monstre à réssuciter. Mais bon on ne peut pas utiliser d'array sinon on serait de mettre ça dans une boucle.

Alors si vous avez une idée, ce ne serait pas de refus (en language simple svp)

Merci. 2
(Ce message a été modifié le : 08-27-2008 07:14 PM par Sephi-Chan.)
08-26-2008 10:08 AM
Trouver tous les messages de cet utilisateur Citer ce message dans une réponse
oxman En ligne
Membre

Messages : 746
Inscription : May 2008
Réputation : 10
Message : #2
RE: Optimisation script (requête SQL)
UPDATE map_monstres SET vie_monstre = "'. $vie_max_monstre .'", exp_monstre = "'. $exp_max_monstre .'", timestamp = "'. $date_actuelle .'" WHERE id_id_monstre IN (SELECT map_monstres.timestamp, monstres.temps, monstres.vie_max_monstre, monstres.exp_max_monstre, map_monstres.id_id_monstre
FROM monstres INNER JOIN map_membres INNER JOIN map_monstres
ON map_monstres.id_case = map_membres.id_case
AND map_membres.login_membre = "'. $_COOKIE['pseudo'] .'"
AND map_monstres.vie_monstre = "0"
AND monstres.id_monstre = map_monstres.id_monstre
AND (NOW - timestamp) >= temps)

Quelque chose dans ce gout là non ?
08-26-2008 10:19 AM
Visiter le site internet de cet utilisateur Trouver tous les messages de cet utilisateur Citer ce message dans une réponse
Ter Rowan Hors ligne
Membre

Messages : 302
Inscription : Jul 2008
Réputation : 4
Message : #3
RE: Optimisation script (requête SQL)
à mon sens ça ne marchera pas, les $max venant de la requête

il faut mettre dans le sql
Code PHP :
SET vie_monstre monstres.vie_max_monstre 

mais je ne sais pas trop faire ces requêtes croisées, pas sûr que cela marche comme ça
(Ce message a été modifié le : 08-26-2008 01:33 PM par Ter Rowan.)
08-26-2008 01:32 PM
Trouver tous les messages de cet utilisateur Citer ce message dans une réponse
oxman En ligne
Membre

Messages : 746
Inscription : May 2008
Réputation : 10
Message : #4
RE: Optimisation script (requête SQL)
Oups pardon en effet, j'ai oublié ceci 2
Et si ça marche t'inquiète, plus simplement on peut mettre SET vie_monstre = vie_max_monstre, mais c'est un détail 2
08-26-2008 01:39 PM
Visiter le site internet de cet utilisateur Trouver tous les messages de cet utilisateur Citer ce message dans une réponse
Joojo Hors ligne
Membre

Messages : 81
Inscription : Jul 2007
Réputation : 2
Message : #5
RE: Optimisation script (requête SQL)
Scusez pour le retard, j'ai du partir peu après. Donc comme l'a dit Ter Rowan j'ai dut enlever les variables et j'ai enlevé "monstres.temps" de la selection de la requête secondaire.

J'ai aussi dut remplacer NOW par time, sql ma dit qu'il ne connaissait pas.

Tout celà pour arriver à: Operand should contain 1 column(s)

UPDATE map_monstres SET vie_monstre = monstres.vie_max_monstre,
exp_monstre = monstres.exp_max_monstre,
timestamp = '. time() .'
WHERE id_id_monstre IN (SELECT map_monstres.id_id_monstre,
map_monstres.timestamp,
monstres.vie_max_monstre,
monstres.exp_max_monstre


FROM monstres INNER JOIN map_membres INNER JOIN map_monstres
ON map_monstres.id_case = map_membres.id_case
AND map_membres.login_membre = "'. $_COOKIE['pseudo'] .'"
AND map_monstres.vie_monstre = 0
AND monstres.id_monstre = map_monstres.id_monstre
AND ('. time() .' - timestamp) >= temps)


Mais il y a un truc qui m'embête là la requête va comparer id_id_monstre à id_id_monstre, timestamp, vie_max_monstre, exp_max_monstre?
08-27-2008 10:20 AM
Trouver tous les messages de cet utilisateur Citer ce message dans une réponse
oxman En ligne
Membre

Messages : 746
Inscription : May 2008
Réputation : 10
Message : #6
RE: Optimisation script (requête SQL)
Oups je dormais oui.
IN (SELECT id_id_monstre,

Vire toutes les autres colonnes 2
08-27-2008 10:35 AM
Visiter le site internet de cet utilisateur Trouver tous les messages de cet utilisateur Citer ce message dans une réponse
Joojo Hors ligne
Membre

Messages : 81
Inscription : Jul 2007
Réputation : 2
Message : #7
RE: Optimisation script (requête SQL)
Le problème c'est que maintenant j'ai une autre erreur: You can't specify target table 'map_monstres' for update in FROM clause
En recherchant je suis tombé la dessus:
vous ne pouvez pas effectuer un UPDATE avec une sous-requête SELECT travaillant sur la même table, pour effectuer cette requête, vous devez créer une table temporaire qui fera la passerelle entre le SELECT et l'UPDATE.
http://www.developpez.net/forums/d494961...om-clause/

Bref cela m'a l'air plus casse bonbec qu'autre chose.

edit: j'ai essayé ceci et ça a l'air de fonctionner:

UPDATE map_monstres INNER JOIN map_membres INNER JOIN monstres
SET vie_monstre = vie_max_monstre,
exp_monstre = exp_max_monstre,
timestamp = '. time() .'

WHERE map_monstres.id_case = map_membres.id_case
AND map_membres.login_membre = "'. $_COOKIE['pseudo'] .'"
AND map_monstres.vie_monstre = 0
AND monstres.id_monstre = map_monstres.id_monstre
AND ('. time() .' - timestamp) >= temps

re-edit: après quelques tests rapides cette requête fonctionne bien, merci à tous les deux pour votre aide 2
(Ce message a été modifié le : 08-27-2008 11:34 AM par Joojo.)
08-27-2008 11:20 AM
Trouver tous les messages de cet utilisateur Citer ce message dans une réponse
oxman En ligne
Membre

Messages : 746
Inscription : May 2008
Réputation : 10
Message : #8
RE: [Résolu]Optimisation script (requête SQL)
Bon bah parfait 2
Je t'avouerais que j'avais répondu au plus simple sans regarder en détail 16
08-27-2008 12:25 PM
Visiter le site internet de cet utilisateur Trouver tous les messages de cet utilisateur Citer ce message dans une réponse
Poster une réponse 



ContactJeuWeb (JeuPHP) - Crée ton jeu par navigateurRetourner en hautRetourner au contenuVersion bas-débit (Archivé)Syndication RSS