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 :
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 :
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.
du coup il croit que c'est le nom d'un champ. ça, ça marcherait mieux :
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: 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 parfaite 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. 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 jeu 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 |