JeuWeb - Crée ton jeu par navigateur
Valeur courante de la transaction - 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 : Valeur courante de la transaction (/showthread.php?tid=4024)



Valeur courante de la transaction - comg - 01-06-2009

Bonjour à tous,

Je me retrouve confronté à un problème, que j'ai toujours cherché à éviter jusqu'à présent, mais qui je sais possède une solution pratique.

Voilà, j'ai 2 tables :

CARTES
id_carte
nom_carte

CARTES_CASES
id_case
id_carte
type_case

Et j'aimerai creer une carte (donc 1 entrée dans CARTES et X entrées dans CARTES_CASES) en reprenant le même id_carte

Je crois qu'il faut utiliser une transaction SQL et la fonction currval mais n'étant pas trés bon en SQL, et n'arrivant pas à me dépatouiller avec les solutions trouvées sur le net, je me tourne vers vous Smile

Si quelqu'un saurait m'expliquer un peu près comment cela marche, je lui en serai trés reconnaissant.

En vous remerciant d'avance.


RE: [MySQL] Valeur courante de la transaction - Argorate - 02-06-2009

J'utilise exactement ce syteme, mis a part que si tu n'as qu'une carte, je ne vois aucune utilité a ton "id_carte" dans ta seconde table.

Je ne vois pas ton problème? tu veux créer une carte, tu semble avoir compris comment gerer tes tables, il te suffit après de dire :
type case = 1 <=> plaine
type case = 2 <=> foret
...
(avec tes conventions)

et de remplir la BDD pour obtenir la carte que tu souhaites.

Par contre es ce que tu travail avec des X et Y?
Parceque si une carte <=> 1 type_case, c'est pas la peine de faire tout ce trafic... Wink


RE: [MySQL] Valeur courante de la transaction - comg - 02-06-2009

J'ai oublié de préciser qu'il y avait plusieurs cartes Smile
C'est pour un petit jeu avec plusieurs carte possible (plus ou moins grande, avec des obstacles différents ect)

Et si je donne cette exemple, c'est surtout pour illustrer mais je cherche en réalité la solution générale à ce problème :
Faire plusieurs entrée SQL avec des valeurs d'id (auto_incrementées) identiques.

Merci tout de même de ton aide.

Edit : Ah oui et je travaille effectivement avec des X et Y, ainsi qu'avec des TailleX et TailleY pour la carte, mais je n'ai pas juger important de les poster Smile


RE: [MySQL] Valeur courante de la transaction - Roworll - 02-06-2009

Je ne pense pas qu'utiliser les transactions soit nécessaire (à moins que tu ne génère plusieurs cartes de manière simultanée)

Pour rappel, les transactions servent à assurer la cohérence d'un jeu d'instruction SQL. Soit toutes les instructions sont validées, soit elles sont toutes annulées)

La fonction qu'il te faut est mysql_insert_id() qui renvoie le dernier ID inséré en base de données.

En gros, ça te donne un truc du genre
Code PHP :
<?php 
mysql_query
('INSERT INTO carte (nom_carte) values (\'nom de ma carte\')' or die(mysql_error());
$carte_id = mysql_insert_id();
mysql_query('INSERT INTO carte_case (carte_id, type_case) VALUES ('.$carte_id.',1)' or die(mysql_error());
mysql_query('INSERT INTO carte_case (carte_id, type_case) VALUES ('.$carte_id.',2)' or die(mysql_error());
//etc

L'utilisation des transactions est donc superflue.


RE: [MySQL] Valeur courante de la transaction - wild-D - 02-06-2009

me semble justement que son soucis est d'assurer la cohérence de ses données insérées. (a priori plus pour un éditeur de map ou un autre contexte applicatif; que de l'insertion brute)

si je reprends ton code roworll; tu vas te retrouver avec une fin de script inopinée si une de tes requêtes foire (...), résultat t'auras inséré qu'une partie de la carte dans la bdd. Or c'est justement ce qu'il veut éviter il me semble.


RE: [MySQL] Valeur courante de la transaction - Roworll - 02-06-2009

Pour moi, le coeur du problème, c'est ça
comg a écrit :Et j'aimerai creer une carte (donc 1 entrée dans CARTES et X entrées dans CARTES_CASES) en reprenant le même id_carte

S'il faut absolument transactionner (je garde le code très basique pour une meilleure lecture):
Code PHP :
<?php 
mysql_query
('SET AUTOCOMMIT=0');
mysql_query('START TRANSACTION');
mysql_query('INSERT INTO carte (nom_carte) values (\'nom de ma carte\')' or die(Rollback());
$carte_id = mysql_insert_id();
mysql_query('INSERT INTO carte_case (carte_id, type_case) VALUES ('.$carte_id.',1)' or die(Rollback());
mysql_query('INSERT INTO carte_case (carte_id, type_case) VALUES ('.$carte_id.',2)' or die(Rollback());
//etc
mysql_query('COMMIT');
mysql_query('SET AUTOCOMMIT=1');

function
Rollback(){
mysql_query('ROLLBACK');
mysql_query('SET AUTOCOMMIT=1');
return
Mysql_Error();
}

Attention, les tables doivent être dans un format supportant les transactions (InnoDB)


RE: [MySQL] Valeur courante de la transaction - comg - 02-06-2009

Dans un premier temps ta fonction mysql_insert_id devrait amplement palier à mon soucis ! Et je t'en remercie !
Pour ce qui est de la transaction, j'avoue en avoir parlé un peu sans savoir exactement de quoi il retournait.
En tout cas merci à vous 2 pour votre aide précieuse ! Je crois que j'ai tout les outils nécéssaire pour me lancer la dedans.

J'avais cependant déjà utiliser (en aveugle :p) une notation du genre :

INSERT INTO carte_case VALUES(carte_id_seq_carte,1) ou un truc du genre...
Ou bien même un currval, mais c'était il y a un moment.

Merci en tout cas !