JeuWeb - Crée ton jeu par navigateur
création d'un nouveau joueur - 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 : création d'un nouveau joueur (/showthread.php?tid=7635)

Pages : 1 2 3


RE: création d'un nouveau joueur - Xenos - 29-04-2016

Tâche de comprendre, sinon, dans 3 mois, "ça ne fonctionnera plus" et tu ne seras pas capable de savoir ce que tu avais fait, pourquoi tu l'avais fait ainsi et pourquoi tu considérais que "cela fonctionnait".

Comme t'as édité, on a aucune idée de quel était le problème, donc on ne pourra pas t'aider à comprendre.


RE: création d'un nouveau joueur - xanthius - 29-04-2016

Tu as raison,
je pensais que ça fonctionnait mais en fait non du moins les requêtes sont envoyés mais j'ai un retour d'erreur :
PHP Warning: mysqli_begin_transaction() expects parameter 2 to be long
J'essaie de trouver un sujet pour comprendre l'erreur via mon ami google mais si tu as une idée je suis preneur ^^

Edit :
j'ai fouillé un peu mais je n'ai pas encore trouvé la raison, par contre je suis en train de lire le tuto sur openclassroom et je ne sais pas si je comprend bien ..

quand je commence une transaction :
- je desactive l'autocommit => mysqli_autocommit($bdd, FALSE);
- je place mes requêtes
- je valide => mysqli_commit($bdd);
c'est tout ?
Si je suis cet enchainement, si j'ai un soucis lors de l'execution d'une des requêtes toutes les requêtes seront annulées ?
Maintenant le rollback : mysqli_rollback($bdd);
je dois le placer à la suite du schéma présenté plus haut ou bien je n'en ai pas besoin


RE: création d'un nouveau joueur - Xenos - 01-05-2016

Faut ouvrir la transaction avant de démarrer tes requêtes. Pour l'annulation, oui, c'est cela (faut juste bien vérifier qu'à la fermeture de la connexion SQL, la transaction est bien annulée et non commitée; là tu peux te contenter de tester: comment le commit(), joue et vérifie que la BDD n'a pas été modifiée). Pour le rollback, tu le places dans ta gestion d'erreur, puisque son rôle est d'annuler la transaction courante (commit = "sauve mes modifs sur le disque pour qu'elles soient vues par tous et enregistées", rollback = "laisse tomber, ne sauve rien, laisse la BDD comme elle était").

Pour ton soucis de paramètre, le message est assez explicite: il te manque le 2nd paramètre de la méthode, consulte la doc (php.net)


RE: création d'un nouveau joueur - xanthius - 01-05-2016

Donc c'est bien ça ?
Code PHP :
<?php
$link
= mysqli_connect("localhost", "my_user", "my_password", "world");

/* Désactive l'auto-commit */
mysqli_autocommit($link, FALSE);

mysqli_query($link, "INSERT INTO aeroports_sugg ( A, B ) VALUES ('donnee','donnee')");

/* Validation */
mysqli_commit($link);


/* Rollback */
mysqli_rollback($link);

mysqli_close($link);
?>



RE: création d'un nouveau joueur - Xenos - 01-05-2016

Non, il faut l'ouvrir ta transaction (bon, je ne connais pas les tutos d'openclassroom, mais normalement, si tu prends un site correctement fichu [en anglais], tu auras de meilleures explication et des explications permettant de comprendre).

=> Ouvrir la connexion SQL
=> Désactiver l'autocommit (si nécessaire)
=> Ouvrir la transaction (mysqli_begin_transaction() un truc du genre, cf doc)
=> Requêtes
=> Checker s'il y a eu des erreurs, qu'elles soient MySQL ou PHP
==> S'il y a des erreurs, les rattraper si possible, sinon, rollback de la transaction + message d'erreur dans les logs/affiché au client
=> Si pas d'erreur, tout s'est bien passé, donc on peut sauver les modifications = commit
=> Ne pas faire d'autre requête d'insertion/update (puisque, maintenant, la transaction a été terminée: elle est soit commitée [sauvée] soit rollbackée [annulée])
=> Fermer la connexion SQL

Je ne te donne pas de "code tout fait" car cela ne sert à rien de copier/coller les choses Wink


RE: création d'un nouveau joueur - xanthius - 02-05-2016

Super merci !

Du coup c'est ça la procédure ?
Code PHP :
<?php    
include('config.php');

/* Désactive l'auto-commit */
mysqli_autocommit($bdd, FALSE);

/* Ouvre la transaction */
mysqli_begin_transaction($bdd, MYSQLI_TRANS_START_READ_WRITE);

/* requête */
$requete = mysqli_query($bdd, "INSERT INTO aeroports_sugg ( A, B ) VALUES ('donnee','donnee')");
$donnee = @mysqli_fetch_array($requete);

/* On recherche s'il y a erreur */
if (!$donnee)
{
printf("Message d'erreur : %s\n", mysqli_error($bdd));
/* Rollback */
mysqli_rollback($bdd);
}else{
/* Validation */
mysqli_commit($bdd);
}

/* On ferme la connexion */
mysqli_close($bdd);
?>

Ma copie est bonne ? Big Grin
au fait je sais pourquoi la dernière fois ça ne marchait pas, en fait le souci venait de là :
MYSQLI_TRANS_START_READ_ONLY
moi je ne voulais pas lire des données mais en écrire du coup il fallait employer :
MYSQLI_TRANS_START_READ_WRITE
et là ça fonctionne


RE: création d'un nouveau joueur - Xenos - 02-05-2016

Cela me semble correct, mis à part la détection d'erreur.
Code :
$donnee = @mysqli_fetch_array($requete);
/* On recherche s'il y a erreur */
if (!$donnee) {

Cela me semble bancal. Pourquoi n'utilises-tu pas les mysqli_error (qqc du genre) qui sont étudiés pour cela (indiquer s'il y a eu une erreur et si oui laquelle, ce qui t'aidera à gérer leur résolution)? A défaut, c'est mysqli_query qui te retourne "FALSE" en cas d'erreur (cf doc), donc autant directement te servir de $requete === false. D'ailleurs, garde à l'esprit qu'une @ (suppress warnings ou suppress error, j'ai un doute tellement je ne m'en sert pas!) est souvent un mauvais design de gestion d'erreur car toute erreur/alerte sera masquée: celle à laquelle tu auras pensé, mais aussi celles auxquelles tu n'auras pas pensé (je ne serai pas surpris que $donee = @mysqli_fetch_array($reguete); plante à chaque fois, sans que tu ne saches pourquoi, et tu vas t'arracher les cheveux à voir que le "q" est devenu "g"). Privilégie l'approche "je check les choses avant (ou ici, après, via mysqli::$errno) et je laisse les erreurs que je n'ai pas checkées arriver (comme ça, je les vois et je pourrai les checker aussi / les corriger)", plutôt que "je masque tout et cela plantera forcément un jour, sans me le dire".

PS: même si mes réponses peuvent être verbeuses, lis-les entièrement (et vérifie que la dernière n'a pas été éditée entre temps), cela t'aurai fait gagner un peu de temps pour READ_WRITE (c'est bien de chercher tout seul quand même Wink )


RE: création d'un nouveau joueur - xanthius - 02-05-2016

(02-05-2016, 10:39 AM)Xenos a écrit : Cela me semble correct, mis à part la détection d'erreur.
Code :
$donnee = @mysqli_fetch_array($requete);
/* On recherche s'il y a erreur */
if (!$donnee) {

Cela me semble bancal. Pourquoi n'utilises-tu pas les mysqli_error (qqc du genre) qui sont étudiés pour cela (indiquer s'il y a eu une erreur et si oui laquelle, ce qui t'aidera à gérer leur résolution)? A défaut, c'est mysqli_query qui te retourne "FALSE" en cas d'erreur (cf doc), donc autant directement te servir de $requete === false. D'ailleurs, garde à l'esprit qu'une @ (suppress warnings ou suppress error, j'ai un doute tellement je ne m'en sert pas!) est souvent un mauvais design de gestion d'erreur car toute erreur/alerte sera masquée: celle à laquelle tu auras pensé, mais aussi celles auxquelles tu n'auras pas pensé (je ne serai pas surpris que $donee = @mysqli_fetch_array($reguete); plante à chaque fois, sans que tu ne saches pourquoi, et tu vas t'arracher les cheveux à voir que le "q" est devenu "g"). Privilégie l'approche "je check les choses avant (ou ici, après, via mysqli::$errno) et je laisse les erreurs que je n'ai pas checkées arriver (comme ça, je les vois et je pourrai les checker aussi / les corriger)", plutôt que "je masque tout et cela plantera forcément un jour, sans me le dire".

PS: même si mes réponses peuvent être verbeuses, lis-les entièrement (et vérifie que la dernière n'a pas été éditée entre temps), cela t'aurai fait gagner un peu de temps pour READ_WRITE (c'est bien de chercher tout seul quand même Wink )

Arg !! J'y étais presque :p !
Donc si j'ai bien compris :
- ne pas utiliser de @ sinon on masque une partie de son environnement à savoir les erreurs qu'on pourrait rencontrer.
- revoir la partie erreur en utilisant le retour false : $requete == false
- utiliser mysqli_error pour afficher les erreurs
ps: merci pour l'aide ! je découvre quelque chose avec ces transactions !
Dire que j'étais tout fier d'avoir trouvé la cause de l'erreur ! La prochaine fois je relirais à deux fois tes messages pour m'éviter une nouvelle douche froide :p


RE: création d'un nouveau joueur - Xenos - 02-05-2016

C'est cela. Smile