JeuWeb - Crée ton jeu par navigateur
Gerer les erreurs SQL - 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 : Gerer les erreurs SQL (/showthread.php?tid=6393)



Gerer les erreurs SQL - tghpow - 18-09-2012

Bonsoir a tous,

J'ai besoin d'un petit peu d'aide sur ce coups.

Je suis en train de faire une fonction, qui permet a un joueur de donner X piece d'or à une ville (Forteresse).

Cette fonction doit:
-Diminuer le nb d'or du joueur (logique^^)
-Remplir une table d'association appelé InvestirFort où la clé primaire est la réunion de:
l'id du joueur/id de la Forteresse/Libelle du Bâtiment où l'or est investis.

Toute fois, je dois différencier 2 cas:
1 er cas: Le joueur as déjà investis, je doit donc faire un Update de cette table.
2eme cas: Le joueur n'a jamais investi ici, je doit injecter les nouvelles données.

Pour différencier les deux cas, j'ai pensé a ce bout de code:

Code PHP :
<?php 
$idInvestissement
='' . $idJoueur . '/' . $idCapitale . '/' . $libelleBat . ''; //Id de l'investissement actuel


$reponseInvest=$bdd->query('select * FROM InvestirFort Where idInvFort=' . $idInvestissement . '');
$Invest=$reponseInvest->fetch();
$idInvestTrouvé=$Invest[idInvFort];


if (
$idInvestTrouvé=$idInvestissement) //Si on as trouvé le même ID, donc si il y a déjà eu investissement
{
$bdd->query('UPDATE InvestirFort SET nbOrInvesti=nbOrInvesti + ' . $nbOr . ' WHERE idInvFort=' . $idInvestissement . '');
}
else
{
$bdd->query('Insert into InvestirFort (idInvFort,libelleBat,nbOrInvesti) VALUES
("'
. $idInvestissement . '"," ' . $libelleBat . '",' . $nbOr . ')');
}


Le probleme ici, est que si le joueur n'a jamais investi dans cette Forteresse, et dans ce Batiment précis, MySQL me renvoie une erreur, comme quoi il ne trouve pas la clé lorsque je fais la recherche WHERE:
Code PHP :
<?php 
$reponseInvest
=$bdd->query('select * FROM InvestirFort Where idInvFort=' . $idInvestissement . '');

Il me répond ceci:

Citation :Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42S22]: Column not found: 1054 Unknown column 'Caserne' in 'where clause'' in C:\wamp\www\test de aranhil\fonctionCapitales.php on line 30

Comment faire?

Est-ce que je dois plutôt regarder si la requete renvoie une erreur (comme je crois l'avoir vu sur un tuto du sdz) Ou bien alors changer d'algo?

Qu'en pensez vous?

Merci de votre aide,
tghpow.


RE: Gerer les erreurs SQL - niahoo - 18-09-2012

C'est parce que ton $idInvestissement n'est pas entouré de quotes une fois la requête construite.

select * FROM InvestirFort Where idInvFort=Caserne

du coup il croit que c'est le nom d'un champ.

ça, ça marcherait mieux :
select * FROM InvestirFort Where idInvFort='Caserne'

$reponseInvest=$bdd->query("select * FROM InvestirFort Where idInvFort = '$idInvestissement'"); 



Je te conseille d'utiliser les PDOStatement pour construire tes requetes sans te préoccuper des quotes.

De plus, au lieu d'indiquer Caserne, tu pourrais passer par un id.

Enfin, mais je ne me souviens plus de la syntaxe, il existe un moyen en SQL de faire simplement un INSERT mais si la clé existe déjà, ça se transforme en update. Faut chercher 'ON DUPLICATE KEY UPDATE' un truc comme ça.

Citation :If you specify ON DUPLICATE KEY UPDATE, and a row is inserted that would cause a duplicate value in a UNIQUE index or PRIMARY KEY, an UPDATE of the old row is performed. For example, if column a is declared as UNIQUE and contains the value 1, the following two statements have identical effect:

INSERT INTO table (a,b,c) VALUES (1,2,3)
ON DUPLICATE KEY UPDATE c=c+1;

UPDATE table SET c=c+1 WHERE a=1;

source http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html

Mais je me demande si c'est efficace. Beaucoup d'implémentations du pattern singleton créent l'instance une seule fois, et ensuite à chaque appel on vérifie qu'une instance existe, et à chaque fois elle existe.

Là c'est utile un coup et ensuite, systématiquement ça fait une exception qui est récupérée. Je ne sais pas si c'est optimisé pour être utilisé de façon soutenue. En tout cas, ça simplifie grandement le code donc par défaut je partirais là dessus.


RE: Gerer les erreurs SQL - tghpow - 18-09-2012

Ahah l'erreur bête! Merci a toi, ta réponse est parfaiteSmile

Je sais pas pourquoi je me suis enteté a faire mes requetes SQL avec des quotes..c'est bien plus simple avec les "", et surtout bien plus lisible!

Citation :De plus, au lieu d'indiquer Caserne, tu pourrais passer par un id.

J'ai peser le pour et le contre des deux façons de faire, et pour plusieurs raisons trop longues a expliquer, je préfère utiliser un libellé plutôt qu'un id sur ce coups.

Je te remercie pour l'astuce de l'inser/Update.
Le pire c'est que j'avais pensé a googler ca pour trouver un truc du genre x)
Merci de ton aide, je viens de tester ca marche a merveille.
Pour le "ON DUPLICATE KEY UPDATE" j'essayerais demain en cours de SQL justement :p


Merci encore,
tghpow.

ps:
Citation :Mais je me demande si c'est efficace. Beaucoup d'implémentations du pattern singleton créent l'instance une seule fois, et ensuite à chaque appel on vérifie qu'une instance existe, et à chaque fois elle existe.

Là c'est utile un coup et ensuite, systématiquement ça fait une exception qui est récupérée. Je ne sais pas si c'est optimisé pour être utilisé de façon soutenue. En tout cas, ça simplifie grandement le code donc par défaut je partirais là dessus.

Si il y bien une chose dont je suis sur, c'est que le code de mon jeu n'est pas des plus optimisés pour l'instant.
J'avoue plus chercher a le faire marcher actuellement, que l'optimiser.
Bien sur, c'est pas pour autant que je code comme un porc:p
Mais je préfère travailler sur l'optimisation vers la fin, d'une j'aurais avancé dans mes études, donc je devrais être plus compétent, et de deux, ça me permettra de refaire un grand tour du jeuSmile
Mais merci quand même de la réflexion.


RE: Gerer les erreurs SQL - Ter Rowan - 19-09-2012

juste pour info, tu as une erreur là :

(enfin je pense)

if ($idInvestTrouvé=$idInvestissement)


RE: Gerer les erreurs SQL - tghpow - 19-09-2012

Eu je ne comprend pas..Où est l'erreur? :p

Par contre je viens de voir que j'ai mit un accent à une variable...horreur!


RE: Gerer les erreurs SQL - Ter Rowan - 19-09-2012

si tu testes deux variables, c'est ==, = c'est de l'affectation


RE: Gerer les erreurs SQL - tghpow - 19-09-2012

Ahah *rire jaune*
Merci ca marche mieux comme ca:p