[PHPMyAdmin] BDD : Interpréter commandes dans l'ordre

Résolu/Fermé
JukeBoy_ - 23 août 2017 à 10:57
 JukeBoy_ - 23 août 2017 à 13:37
Bonjour à tous !

Comment demander à ma BDD de réaliser les requêtes SQL dans l'ordre reçu, et non d'une façon qui l'allège certainement ?
Je voudrais une file, car actuellement certaines de mes requête passent en priorité : je me retrouve avec mes INSERT avant mes DELETE, alors que je veux supprimer un paquet de données, puis réinjecter. Pas pratique :( ...

Merci d'avance !

JukeBoy_

--------------------------------------------------------------------------------
Si ma question n'est pas claire, voici le contexte :

Une page PHP envoie des requêtes à la BDD pour des mises à jour, environ 2 par secondes, pendant environ 20/30 secondes.
Ce que je fais : les modifications ayant lieu sur un clef "token", il suffit que 2 personnes utilisent le même jeton (ou la même personne sur 2 ordinateurs différents) pour qu'il y ai concurrence.
La récupération/désérialisation n'a lieu qu'un seule fois. Je pars alors du principe que je peux supprimer tous les éléments de ma base, et faire un INSERT avec toutes les données, plutôt qu'un UPDATE (= viable, les infos changent quasi de tout au tout à chaque requête).

Donc le schéma récapitulatif :

Page PHP --> Rentrer le token --> Désérialiser --> Modifications par User --> Suppression de toutes les lignes avec le token en ID --> Réinsertion (40 fois environ).

Sauf que, le Token est en $_POST, donc, si j'actualise ma page, cela réinsere le token automatiquement (pour un gain de temps). Et le soucis est ici, si je "spam" (environ une fois par seconde) F5 pour rafraîchir, des lignes disparaissent.

Dans le script, on se retrouve alors avec (code sorti de mon PHP, il y a evidemment des bindValue) :

$token = "abcde";
$truc = 1;
$tric = 2;
$trac = 3;

DELETE FROM machine WHERE token=:token;
INSERT INTO machine VALUES (DEFAULT,:token,:truc);
INSERT INTO machine VALUES (DEFAULT,:token,:tric);
INSERT INTO machine VALUES (DEFAULT,:token,:trac);


En regardant ma base, des fois je n'ai qu'une ligne, des fois les 3, des fois aucunes, des fois 2 etc...
Même en réitérant ce bloc de requêtes 20 fois, je suis toujours censé me retrouver avec ces 3 lignes dans ma BDD non ?

Merci de m'éclairer :) !

2 réponses

jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 4 650
23 août 2017 à 11:56
Bonjour,

Dans ton titre tu parles de phpmyadmin ... phpmyadmin est juste une application (une interface) qui te permet de manipuler ta BDD.

BDD qui, au passage, est Mysql (j'ai donc déplacé ta question dans le forum mysql).

Et ensuite... tu nous expliques que tes requêtes sont effectuées via un script PHP ..... donc... pas directement dans ta BDD .... (donc aucun rapport avec phpmyadmin).

Bref... pour finir je pense que le souci vient du fonctionnement de ton script php ... c'est donc CE SCRIPT LA qu'il faut nous montrer et nous expliquer EN DETAIL ce qu'il est sensé faire.
(A ce moment là.. je déplacerai la question dans le forum PHP )


NB: Tu parles de tocken et de $_POST ... pour éviter les réinsertions multiples liés à l'utilisation du bouton F5 ... il existe des solutions en utilisant les variables de SESSION et/ou encore mieux .... en utilisant l' AJAX.


0
Salut Jordane, merci pour ta réponse.

Je parlais de PHPMyAdmin, car effectivement, je ne pensais pas que mon script PHP serait mauvais, je pensais que c'était une histoire de config de BDD, et je demandais comment faire sous cet interface.

J'utilise effectivement l'AJAX, pour que mon enregistrement se fasse en tache de fond. Je souhaite mettre a la file mes requêtes SQL, que le bloc "DELETE INPUT INPUT INPUT" s'effectue toujours dans cet ordre là.

Tous les scripts fonctionne, je t'épargne donc les try-catch, les bindValue, les $_POST etc..

Je vais résumer les script PHP :

main.php :
$token = "ABCDEF";
$.post('delete_info_token.php',{token: token_actuel},function(retour){});
$.post('simul_enregistre.php',{
	token: token_actuel,
	mach_id: tab_machine[key]["mach_id"],
	left: $('#'+key).css("left"),
	top: $('#'+key).css("top"),
},function(retour){//console.log(retour);});	


delete_info_token.php :
$cnx = new PDO etc..;
$req = $cnx->prepare("DELETE FROM machine WHERE token=:token;");
$req-> bindValue(':token',$token);
$req-> execute();


simul_enregistre.php:
$cnx = new PDO etc..;
$req = $cnx->prepare("INSERT INTO machine VALUES (DEFAULT,:token,:mach_id,:left,:top);");

//[...] ICI tous les bindValue.

$req-> execute();


C'est cette partie là qui est spammée quand on rafraîchi (seuls scripts de mon programme comportant des DELETE et des INSERT).
0
jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 4 650
23 août 2017 à 13:22
Pour l'ajax je te conseille d’utiliser la syntaxe suivante afin de mieux voir les éventuelles erreurs :
$.ajax({ 
      type: "POST",
      url: urldufichierAjxphp,
      data: lesdata,
      async: false,
      dataType: "json",
      success: function(reponse){
       // ici le code en cas de succès
       },
      error:function(jqXHR, textStatus){
           // ici le code en cas d'erreur
         }
        }
     }); 

Tu verras qu'il y a un paramètre async que tu peux avoir à true ou false.
Autrement dit .. synchrone ou asynchrone ...
Je pense que ton souci vient de là.

Au passage ...
1 - Place le code de connexion à ta bdd dans un fichier à part que tu n'auras qu'à inclure lorsque tu en as besoin au lieu de le répéter dans chacun de tes codes

2 - Active la gestion des erreurs PDO et place tes requêtes ( chaque requête ! ) dans un bloc Try/Catch
Voir ici : https://forums.commentcamarche.net/forum/affich-37584941-php-pdo-gerer-les-erreurs
0
Je viens de prendre ta syntaxe, et avec async:false, ça fonctionne parfaitement bien !
Merci beaucoup, je ne connaissais pas du tout, c'est très pratique !
Le soucis venait effectivement de là !

1. C'est fait, je ne voulais pas alourdir le code sur le forum avec des include, jai un fichier cnx.php

2. C'est fait aussi, toutes mes requêtes sont en try catch, et j'utilise :
catch(PDOExeption $e){/*[...]*/}

En tout cas merci beaucoup pour ton aide, j'ai appris un truc super utile et mon projet a bien avancé !
0