[Résolu] PHP, PDO, transactions et procédures stockées

PHP, PDO, transactions et procédures stockées [Résolu] - PHP - Programmation

Marsh Posté le 15-06-2019 à 21:58:46    

Bonjour tout le monde  :hello:  
 
J'ai un soucis avec php et l'extension pdo. J'ai bien cherché sur divers topics ou sur google mais je n'arrive pas à trouver d'informations pour m'aider.
 
Je suis sur MySQL et j'ai une procédure toute simple :
 

Code :
  1. CREATE PROCEDURE `test`(
  2.     p_name VARCHAR(155))
  3. BEGIN
  4.     INSERT INTO test (name) VALUES (p_name);
  5.     SELECT last_insert_id() AS Result;
  6. END


 
Côté PHP, j'ai le code suivant :
 

Code :
  1. $db = new PDO("mysql:host=192.168.1.200;port=3307;dbname=mbd","root","password" );
  2. $db->beginTransaction();
  3. $query = $db->prepare("CALL test (?)" );
  4. $query->bindValue(1, 'blablabla', PDO::PARAM_STR);
  5. $query->execute();
  6. $db->commit();
  7. $result = $res->fetchAll(PDO::FETCH_ASSOC);
  8. if (is_array($result)&&count($result)>0)
  9. echo "ID=".$result[0]["Result"];


 
J'ai supprimé les contrôles de mon code pour simplifier l'exemple.
 
Lorsque j'exécute ma page PHP, tout se passe bien : la transaction se lance, la requête est exécutée, ma transaction est validée et j'ai bien mon ID qui s'affiche. A chaque actualisation de ma page, mon ID s'incrémente, signe que mon autoincrement dans la base fonctionne.
 
Et pourtant ! Je n'ai strictement aucun enregistrement dans ma table `test` ! Pourtant, si j'exécute le même bout de code sans transaction ça fonctionne. Idem côté Mysql : si je fais appel à ma procédure, ça fonctionne aussi. Si je garde les transactions PDO mais qu'à la place d'une requête préparées j'utilise ça :
 

Code :
  1. $db->query("CALL test ('blablabla')";


 
Ça fonctionne aussi...  :pt1cable:  
 
Alors quoi ? Une incompatibilité avec les transactions, les requêtes préparées et mysql ?  
 
Quelqu'un a une idée de l'origine de ce problème ?  
 
Merci pour vos retours  :)


Message édité par matheo265 le 16-06-2019 à 12:01:45
Reply

Marsh Posté le 15-06-2019 à 21:58:46   

Reply

Marsh Posté le 15-06-2019 à 22:39:27    

Un élément intéressant que je viens juste de découvrir.  
 
Depuis PHP, si après avoir validé ma transaction je fais un "SELECT * FROM" j'ai bien mon enregistrement qui s'affiche.
 
Par contre si je me déconnecte puis que je recréé un objet PDO
 

Code :
  1. $db = null;
  2. $db = new PDO(...


 
ben là plus aucune trace des enregistrements  :??:  C'est comme si les modifications que je faisais étaient volatiles et qu'une fois la connexion coupée ils disparaissaient :heink:

Reply

Marsh Posté le 15-06-2019 à 23:17:30    

J'ai trouvé une solution... J'ai remplacé les lignes suivantes :
 

Code :
  1. $db->beginTransaction();
  2. $db->commit();


 
Par :
 

Code :
  1. $db->query("BEGIN;" );
  2. $db->query("COMMIT;" );


 
Et ça fonctionne. Alors pour le serveur, après vérification, c'est du MariaDB... Mais bizarre car ça reste du MySQL...  
 
Je vais m'en contenter ^^ Mais si je pouvais au moins comprendre ça m'aiderait bien  :D  

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed