Page 1 sur 1

Pb Sauvegarde dans la bdd avec ON DUPLICATE KEY UPDATE

Posté : 28 mars 2010, 16:58
par fabien62
Bonjour,

Je me permet de poster mon problème, j'ai cherché, mais en vain :cry:

J'utilise PDO, et je fait pas mal d'INSERT et UPDATE.

Avant j'utilisais une méthode toute moche qui consisté à compter le nombre d'entrée, si l'entrée était de 0 je faisait un INSERT, si elle était de 1, je faisait un UPDATE.

J'essaie donc de passer à DUPLICATE KEY UPDATE, mais rien ne s'enregistre, et je n'es aucun message d'erreur.

En d'autres termes, je patauge, voici mon code, et vous remercie à l'avance.

Petite précision, je suis en local, et je débute.

$test1='test';
$test2='test2';
$test3=100;

$sql = $bdd->prepare('INSERT INTO test (test1, test2, test3) 
                VALUES(:test1,:test2,:test3) 
                ON DUPLICATE KEY UPDATE 
                test1=VALUES(:test1),test2=VALUES(:test2),test3=VALUES(:test3)');

$sql->bindValue(':test1', $test1, PDO::PARAM_STR);
$sql->bindValue(':test2', $test2, PDO::PARAM_STR);
$sql->bindValue(':test3', $test3, PDO::PARAM_INT);
$sql->execute();
$sql->closeCursor();

	?>

Re: Pb Sauvegarde dans la bdd avec ON DUPLICATE KEY UPDATE

Posté : 28 mars 2010, 22:56
par jojolapine
Bonsoir,

Est-ce que ta requête fonctionne hors de PHP (sur phpmyadmin ou en ligne de commande)?
Donnes la structure de tes tables ;)

Re: Pb Sauvegarde dans la bdd avec ON DUPLICATE KEY UPDATE

Posté : 29 mars 2010, 14:39
par fabien62
Merci de m'aider :D

Je ne sais pas si ma requête fonctionne sur phpMyAdmin ou en ligne de commande, car je ne sais tout simplement pas faire ce genre d'action :|

Pour la structure, un peu d'explications :

En fait, je fait un jeu, ici le point concerner, concerne des mises, que les joueurs font sur un pari.

Lors du premier pari, je fait un INSERT, mais si le joueur souhaite encore miser, je fait un update.

Voici comment ce compose ma table :

Table : mise

Champ- Type Interclassement Attributs Null Défaut Extra
id int(11) Non Aucun auto_increment
pseudo tiny text latin1_swedish_ci Non Aucun
mise bigint(20) UNSIGNED Non Aucun
gagnant tinytext latin1_swedish_ci Non Aucun
idpari bigint(20) UNSIGNED Non Aucun


Voici comment je m'en sert :
J'affiche les paris dont les valeurs, sont dans la table pari

J'ai un formulaire, qui reprend l'id unique du combat(idpari), la mise(mise), et sur qui on pari(gagnant).

Ensuite, j'entre les infos dans la table mise

id->Auto-increment (je ne fait rien)
pseudo ->Le pseudo du joueur qui pari
mise->la mise jouer ( qui s'additionne si le joueur souhaites augmenter sa mise)
gagnant->le pseudo de celui que l'on souhaites voir gagner
idpari ->l'id du pari (qui me permet, une fois que l'affrontement a eu lieu, de récupérer le vainqueur et de distribuer les gains)

Les champs id, pseudo, gagnant et id pari lors d'un UPDATE reste statique, je ne touche qu'a la mise.

Voila :wink:

EDIT : Bon y a de l'avancement, sa fonctionne mais pas comme je le souhaiterais.

J'ai du mettre les champs pseudo, gagnant, idpari en index unique sur la base de données.

Il m'enregistre bien tout, insert comme update.

Mais si je souhaites par exemple parier sur le même combat, avec un gagnant différent, voici ce qui se passe :

CODE 1
$pseudo='francis';
$mise=1000;
$gagnant='robert';
//$gagnant='roger';
$idpari=1;

$test=$bdd->prepare('INSERT INTO mise (pseudo, mise, gagnant, idpari) VALUES (:pseudo, :mise, :gagnant, :idpari)
ON DUPLICATE KEY UPDATE pseudo=:pseudo, mise=mise+ :mise, gagnant= :gagnant, idpari= :idpari');
$test->bindValue(':pseudo', $pseudo, PDO::PARAM_STR);
$test->bindValue(':mise', $mise, PDO::PARAM_INT);
$test->bindValue(':gagnant', $gagnant, PDO::PARAM_STR);
$test->bindValue(':idpari', $idpari, PDO::PARAM_INT);
$test->execute();
$test->closeCursor();
Dans le code ci-dessus -> Si ensuite je mise sur Roger, je n'es pas de nouvelle entrée, la mise s'additionne, et le gagnant n'est plus Robert, mais Roger.

Avec ce code :
$test=$bdd->prepare('INSERT INTO mise (pseudo, mise, gagnant, idpari) VALUES (:pseudo, :mise, :gagnant, :idpari)
ON DUPLICATE KEY UPDATE mise=mise+ :mise');
$test->bindValue(':pseudo', $pseudo, PDO::PARAM_STR);
$test->bindValue(':mise', $mise, PDO::PARAM_INT);
$test->bindValue(':gagnant', $gagnant, PDO::PARAM_STR);
$test->bindValue(':idpari', $idpari, PDO::PARAM_INT);
$test->execute();
$test->closeCursor();
Pas de nouvelle entrée, mais j'ai un update sur la mise.

Si sa fonctionne en unique, je ne penses pas que je puisse utiliser DUPLICATE KEY UPDATE, a moins de faire une configuration différente des champs unique.

Re: Pb Sauvegarde dans la bdd avec ON DUPLICATE KEY UPDATE

Posté : 29 mars 2010, 16:39
par macgawel
Table : mise

Champ- Type Interclassement Attributs Null Défaut Extra
id int(11) Non Aucun auto_increment
Le problème, à mon avis, c'est que tu essayes de fournir une valeur à un champ défini comme autoincrement.
=> Soit tu enlèves l'attibut Autoincrement et tu gères toi-même l'ID, soit tu décompose les cas - UPDATE ou INSERT...

Edit : erreur de frappe :oops:

Re: Pb Sauvegarde dans la bdd avec ON DUPLICATE KEY UPDATE

Posté : 29 mars 2010, 17:54
par fabien62
J'ai remis la config de base.

" soit tu décompose les cas - UPDATE ou INSERT... "

C'est a dire ?

Merci

Re: Pb Sauvegarde dans la bdd avec ON DUPLICATE KEY UPDATE

Posté : 29 mars 2010, 20:50
par macgawel
Ca doit être à peu près ce que tu fais :

Code : Tout sélectionner

SELECT sur l'id SI on trouve quelque chose On fait un UPDATE SINON On fait un INSERT

Re: Pb Sauvegarde dans la bdd avec ON DUPLICATE KEY UPDATE

Posté : 30 mars 2010, 13:38
par fabien62
Oui c'est déjà ce que je fait.

Dommage j'aurais aimer optimiser ce système.