JeuWeb - Crée ton jeu par navigateur
WHERE dans un ODKU ? - 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 : WHERE dans un ODKU ? (/showthread.php?tid=7829)



WHERE dans un ODKU ? - MeTaLLiQuE - 19-06-2017

Bonjour,

J'ai un soucis avec un script-là ... Dans mon panel d'administration, j'offrirai la possibilité aux futurs administrateurs, de modifier le nombre de bâtiments des joueurs via un simple input.

Si le bâtiment n'a pas été construit, il n'y a aucune ligne dans la bdd (logique). Or, si elle existe, elle doit s'UPDATE et pas s'INSERT.

Pour ce faire, j'utilise le INSERT ... ON DUPLICATE KEY UPDATE ... Mais le soucis, c'est que je n'arrive pas à sélectionner l'id du joueur ainsi que l'id du bâtiment.

Je m'explique :

J'ai une table, content id, id_user, id_batiment, nb_batiment.

J'aimerais en gros faire : 

Code :
INSERT INTO batiments_users (`id_user`,`id_batiment`,`nb_batiment`) VALUES (:id_user, :id_batiment, :nb_batiment) ON DUPLICATE KEY UPDATE nb_batiment= :nb_batiment WHERE id_user= :id_user AND id_batiment= :id_batiment

Ma question est: est-il possible d'utiliser WHERE dans mon ODKU ? Si oui, comment l'appliquer ? Si non, existe-t-il une alternative ? 

Je ne sais pas si j'ai été assez clair :/

EDIT :

Pour faire plus court, au caou si je me suis fais mal comprendre ci-dessus :
S'il trouve que id_user et id_batiment existe, on fait un update de nb_batiment
Sinon, il insère id_user, id_batiment et nb_batiment

Merci d'avance,


RE: WHERE dans un ODKU ? - Xenos - 19-06-2017

Salut,

Ta demande n'a pas de sens en fait, car "ON DUPLICATE KEY UPDATE" fait exactement ce que la traduction suggère: "Si l'insertion génère un doublon, mettre à jour la ligne existante". Donc, tu n'as juste pas besoin de "WHERE":

Code :
INSERT INTO batiments_users (`id_user`,`id_batiment`,`nb_batiment`)
VALUES (:id_user, :id_batiment, :nb_batiment)
ON DUPLICATE KEY UPDATE nb_batiment= VALUES(nb_batiment)

Nota: j'ai remplacé ton dernier paramètre de requête par VALUES(nb_batiments), qui signifie "la valeur de la colonne [nb_batiment] si l'insertion avait eue lieu".


RE: WHERE dans un ODKU ? - MeTaLLiQuE - 19-06-2017

Je sais, pour ça que je demande... Ca me semblait louche... Car sans le WHERE, ça m'insérais une nouvelle ligne quand même....

Je vais essayer voir ce que ça donne. Merci.

EDIT :

En faite, ça m'insère toujours une nouvelle ligne...

Il faut que, id_user et id_batiment soient déjà dans la bdd pour que ça fasse un update sinon, un insert. Mais là, j'ai déjà id_user et id_batiment dans la bdd et... Ca m'insère une nouvelle ligne, donc du coup, je me retrouve avec :

ID_USER ID_BATIMENT NB_BATIMENT
2 17 2
2 17 3

Au lieu de :

ID_USER ID_BATIMENT NB_BATIMENT
2 17 3

(2 -> 3 car j'octroie un bâtiment de plus au joueur, donc ça aurait dû update l'ancienne ligne, et non faire un insert)


RE: WHERE dans un ODKU ? - Xenos - 19-06-2017

Ouep, mais as-tu mis une clef unique (PRIMARY ou UNIQUE INDEX) sur ces deux colonnes en même temps? Sinon, MySQL ne verra pas qu'il y a un doublon Wink


RE: WHERE dans un ODKU ? - MeTaLLiQuE - 19-06-2017

Hmmm... J'ai supprimé mon UNIQUE INDEX sur id_user et id_bat, je l'ai refait et ça fonctionne oO

Va savoir... Merci pour tes réponses et pour ta VALUES() Wink


RE: WHERE dans un ODKU ? - Xenos - 19-06-2017

De rien. A mon avis, il ne devait pas être unique.