IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

[MySQLi] Prise en compte d'un rollback


Sujet :

PHP & Base de données

  1. #1
    Membre confirmé
    Inscrit en
    Novembre 2005
    Messages
    188
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 188
    Par défaut [MySQLi] Prise en compte d'un rollback
    salut,

    j'essaye de basculer de l'utilisation de fonctions mysql vers mysqli mais je rencontre un probleme avec les rollbacks notament.

    auparavant j'executais mes requetes sql grace a la fonction ci dessous (en mysql ) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    function runSQL($sql_string){
    	$link =	mysql_pconnect($config['db_server'], $config['db_user'], $config['db_password']);
    	if($link == false) {
    		exit("Can not connect to database : \"".$config['db_database']."\". Mysql error : ".mysql_error());
    	}
     
    	$db_selected = mysql_select_db($config['db_database'], $link);
    	if($db_selected == false) {
    		exit("Can not select database : \"".$config['db_database']."\". Mysql error : ".mysql_error());
    	}
     
    	$res  = mysql_query($sql_string,$link);	
     
            $result = array();
    	for ($i=0; $i<mysql_num_rows($res); $i++) {
                   $result[] = mysql_fetch_assoc($res);
    	}
    	mysql_free_result($res);
    	mysql_close($link);
            return $result; 
    }
    et la combinaison suivante fonctionnait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    runSQL("START TRANSACTION;");
    runSQL("DELETE FROM test;");
    runSQL("ROLLBACK;");
    maintenant avec ma nouvelle fonction runSQL qui utilise mysqli, je vois bien passer le rollback dans la liste des requetes exécutées mais le delete n'est plus annulé.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    function runSQL($sql_string){
    	$mysqli = new mysqli($config['db_server'], $config['db_user'], $config['db_password'], $config['db_database']);
     
    	$resultQuery = $mysqli->query($sql_string);
     
    	$result = array();
    	for ($i=0; $i<$resultQuery->num_rows; $i++) {
    		   $result[] = $resultQuery->fetch_assoc();
    	}
    	$mysqli->close();
            return $result; 
    }
    je me dis que c'est peut etre du au fait que les 3 requetes exécutés ne travaillent pas sur la meme connection et que donc, le rollback ne fait pas un rollback du delete mais un rollback sur rien du tout... vous me suivez? en tout cas si vous avez des idées, n'hesitez pas.

    une autre chose peut etre intéressante. si dans ma fonction en mysql, j'utilise un mysql_connect au lieu d'un mysql_pconnect, alors mes rollbacks ne fonctionnnent plus non plus. Peut etre que ma fonction en mysqli fait l'equivalent d'un mysql_connect et non un mysql_pconnect. mais je ne sais pas comment faire un mysql_pconnect en mysqli...

    merci d'avance

  2. #2
    Membre chevronné Avatar de SphynXz
    Développeur Web
    Inscrit en
    Mars 2008
    Messages
    439
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2008
    Messages : 439
    Par défaut
    et en rajoutant après :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $resultQuery = $mysqli->query($sql_string);
    ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $mysqli->commit();
    ??

    c'est une simple supposition

  3. #3
    Membre confirmé
    Inscrit en
    Novembre 2005
    Messages
    188
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 188
    Par défaut
    ben non ca n'ira pas, parceque dans ma fonction runSQL je ne sais pas encore si je vais faire un commit ou un rollback... en fait mes appels a la fonction runSQL ressemble a ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    runSQL("START TRANSACTION;");
    runSQL("DELETE FROM test;");
     
    if(xxxxxx){
           runSQL("ROLLBACK;");
    }else{
           runSQL("COMMIT;");
    }

  4. #4
    Membre chevronné Avatar de SphynXz
    Développeur Web
    Inscrit en
    Mars 2008
    Messages
    439
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2008
    Messages : 439
    Par défaut
    je comprend ta logique. et le problème est que c'est une logique orienté MySQL! Et non MySQLi. MySQLi dispose de ses propres fonctions / méthodes commit et rollback.

    De plus, et les deux dernières fonctions trouven tlà toute leur utilité, il y à la fonction / méthode autocommit!


    Logique MySQL :

    -J'éxécute (query).
    -Je valide ou j'annule? (commit ou rollback)

    Logique MySQLi :
    -je désactive l'autocommit *
    -j'éxécute (query)
    -je valide (commit)
    -dois-je annuler? (rollback) *

    * : Si l'autocommit est à true, le rollback n'aura aucun effet.

    Pour plus d'infos : Cliquez ici

  5. #5
    Membre confirmé
    Inscrit en
    Novembre 2005
    Messages
    188
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 188
    Par défaut
    j'ai beau joué avec l'autocommit comme je veux, et ca ne fais jamais ce que je veux. il faudrait je pense, que je revoie completement ma fonction runSQL qui créé un nouvel objet mysqli pour chaque requete. Pour que le rollback ou commit fonctionne correctement, il faut laisser la connection ouverte je pense, non?

  6. #6
    Membre chevronné Avatar de SphynXz
    Développeur Web
    Inscrit en
    Mars 2008
    Messages
    439
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2008
    Messages : 439
    Par défaut
    ou elle doit rester ouverte! sinon tout sera commit dès la fermeture!

Discussions similaires

  1. [VB.NET] [DataGrid] [TableStyles] Pb de prise en compte
    Par Misterburma dans le forum Windows Forms
    Réponses: 6
    Dernier message: 19/04/2005, 14h00
  2. [netbeans] Modifications non prises en compte
    Par nadass dans le forum NetBeans
    Réponses: 6
    Dernier message: 07/04/2005, 13h49
  3. Lecture de fichier - dernière ligne non prise en compte
    Par JulienPles dans le forum Algorithmes et structures de données
    Réponses: 3
    Dernier message: 16/03/2005, 11h57
  4. Prise en compte des contraintes
    Par potanie dans le forum Décisions SGBD
    Réponses: 1
    Dernier message: 05/11/2004, 10h00
  5. [MFC]: prise en compte du clavier
    Par ben_iap dans le forum MFC
    Réponses: 8
    Dernier message: 20/01/2004, 15h00

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo