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

Langage PHP Discussion :

Erreurs SQL avec PHP et AJAX


Sujet :

Langage PHP

  1. #1
    Candidat au Club
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Mai 2014
    Messages : 5
    Points : 3
    Points
    3
    Par défaut Erreurs SQL avec PHP et AJAX
    Je suis sur un projet personnel de développement avec du PHP, SQL et JavaScript (+ bibliothèque jQuery).

    Actuellement, j'ai un formulaire HTML qui lorsqu'il est soumis est traité par un code JS.

    Si les données sont correctes, il rentre dans la fonction $.post de jQuery.

    Dans cette fonction, j'ai paramétré un retour de type "text" par le page de traitement PHP.

    Tout fonctionne très bien, je bute juste sur un aspect : recevoir le code erreur SQL lorsque la requête échoue.

    Actuellement, si la requête réussi, j'ai un "echo success;" et si elle échoue j'ai un "echo failed;" rien de bien sorcier.

    Je voudrais avoir le code erreur SQL en "string" et pouvoir le retourner dans mon echo.

    Par exemple, je souhaite supprimer une ligne dans une de mes tables, mais la valeur est une clef étrangère d'une autre table.

    Je voudrais pouvoir le savoir par le biais du PHP, du style :

    echo "failed"+ "error SQL : code 1451 - blabla"

    Pouvez-vous m'aider ?

    Si mes explications ne sont pas assez claires, j'essayerai de poster un bout de code montrant ce que je voudrais obtenir.

    Merci d'avance

    Cdt

  2. #2
    Candidat au Club
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Mai 2014
    Messages : 5
    Points : 3
    Points
    3
    Par défaut Réponse
    J'ai trouvé la solution :

    Dans mon fichier PHP contenant mes données pour la connexion à la base de données avec PDO,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    	try 
    	{   
    		$DSN = 'mysql:host='.$dbserver.';port=3306;dbname='.$dbname.'';			
    		$Connection = new PDO($DSN, $dbuser, $dbpass, array (PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\''));
            $Connection->setAttribute(PDO::ATTR_EMULATE_PREPARES,false); 
     
           # print "Connection it's ok !";
    	} 
    	catch ( PDOException $e )
    	{
    		print "Erreur !: " . $e->getMessage() . "<br/>";
    		die();
    	}
    j'ai rajouté cette ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
            $Connection->setAttribute(PDO::ATTR_EMULATE_PREPARES,false);
    Et dans mon code PHP :

    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    <?php
        require_once($_SERVER['DOCUMENT_ROOT']."/globals.inc.php");
        require_once(PDO);
     
        //$Query="DELETE FROM FontAdmin WHERE `Id` = 1";
        //$Query="dddd";
        $Query="select * from tabled";
     
        echo "Query : ".$Query;
     
        $SQL = $Connection->prepare($Query);
     
     
        if (!$SQL) 
        {
           echo "<br>PDO::errorInfo():<br>";
           $ArrayError=$Connection->errorInfo();
           print_r($ArrayError);
            $SQLState = $ArrayError[0];
            $CodeDriver = $ArrayError[1];
            $MessageDriver = $ArrayError[2];
     
           echo "<br>\$SQLState : $SQLState";
           echo "<br>\$CodeDriver : $CodeDriver";
           echo "<br>\$MessageDriver : $MessageDriver";
        }
        else
        {
            $QueryState=$SQL->execute(); 
            $Count = $SQL->rowCount();
     
            if (!$QueryState) 
            {
                    echo "<br>query failed";         
            }
            else
            {
                if($Count>0)
                {
                    echo "<br>query ok";         
                }
                else
                {
                    echo "<br>query pas de ligne modifiée";         
                }
     
            }
        }
    ?>
    Grâce à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $Connection->errorInfo();
    , je récupère les infos sur l'erreur SQL.

    Bye

  3. #3
    Candidat au Club
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Mai 2014
    Messages : 5
    Points : 3
    Points
    3
    Par défaut Solution mais à moitié
    En faite si la requête est mal construite ou si la table n'existe pas, j'ai bien un retour.

    Cependant par exemple, si ma requête est correcte mais que l'exécution n'est pas celle attendue (ne supprime pas car il y a une clef étrangère par exemple),
    je ne reçois aucun message d'erreur !

    J'arrive à savoir que le résultat attendue n'est pas là car le retour est "null" sinon il serait supérieur à 0.

    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
        require_once($_SERVER['DOCUMENT_ROOT']."/globals.inc.php");
        require_once(PDO);
     
     
        try {
            // Préparation de la requète : 
            $Query="DELETE FROM ".TABLE_ADMIN_STRUCTURE_ICONS_FONTS." WHERE `Id` = 1";
            $SQL = $Connection->prepare($Query);
            $QueryState=$SQL->execute(); 
            $Count = $SQL->rowCount();
     
            echo "\$QueryState value : $QueryState";
     
            if(!$QueryState)
            {
                echo "<br>query ko";         
            }
            else
            {
                if($Count>0)
                {
                    echo "<br>query ok";         
                }
                else
                {
                    echo "<br>query pas de ligne modifiée";         
                }
            }
        }
        catch (PDOException $e)
        {
            echo $e -> getMessage();
    //        $erreur = explode(':', $e->getMessage());
    //        if($erreur[2]==1451){
    //            echo 'foreignkey';
    //        }
    //        else {
    //            echo $e -> getMessage();
    //        }
        }
    Comment afficher le code erreur, ici qui devrait être 1451 pour une clé étrangère ?

    Merci

    Cdt

  4. #4
    Candidat au Club
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Mai 2014
    Messages : 5
    Points : 3
    Points
    3
    Par défaut Doc PHP
    En ajoutant ça à mon fichier PDO :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $Connection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    Mon try/catch fonctionne !

    Merci la doc PHP, je l'avais mal comprise mais en cherchant plus loin j'ai trouvé ça : http://php.net/manual/fr/pdo.error-handling.php et c'est exactement la solution

  5. #5
    Candidat au Club
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Mai 2014
    Messages : 5
    Points : 3
    Points
    3
    Par défaut Solution
    Voici le code obtenu :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
        catch (PDOException $e)
        {        
            $ErrorExplode = explode(': ', $e->getMessage());
            //$Error = $ErrorExplode[0]; //inutile correspond à getCode();
            $ErrorCode = $e -> getCode();
            $Error = $ErrorExplode[1];
            unset($ErrorExplode[0]);
            unset($ErrorExplode[1]);
            $ErrorEnd = implode(" : ",$ErrorExplode);
            $ErrorExplode = explode(' ',$ErrorEnd);        
            $ErrorSQLCode = $ErrorExplode[0];
            unset($ErrorExplode[0]);
            $ErrorDescription = implode(" ",$ErrorExplode);
        }
    • Je récupère le code SQLState vu dans getMessage() proprement avec getCode()
    • J'explose la chaîne obtenu par getMessage(), caractère séparateur : le ":" avec un espace après
    • Je récupère l'erreur SQL contenu dans le 2e élément du tableau
    • Je retire le SQLState et l'erreur SQL de mon tableau et je le re-transforme en chaîne séparé par ":" avec un espace avant et après (pour ne pas abîmer la syntaxe de la description d'erreur de SQL)
    • J'explose la chaîne régénérée, caractère séparateur : " " un espace
    • Je récupère le code erreur SQL.
    • Je retire le code erreur SQL de mon tableau et je le re-transforme en chaîne séparé par " " un espace.
    • Je stocke cette nouvelle chaîne dans une variable pour la description de l'erreur SQL


    J'obtiens donc 4 variables :


    J'aurais finalement débuggé tout seul mon problème.

    En espérant que ça pourra aider !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [SQL] Erreur SQL dans php
    Par joker vb dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 03/05/2007, 12h37
  2. Récupérer une erreur SQL avec TIBDataSet
    Par cgone dans le forum Bases de données
    Réponses: 3
    Dernier message: 25/10/2006, 01h00
  3. Erreur SQL avec SELECT
    Par matt0749 dans le forum Débuter
    Réponses: 15
    Dernier message: 17/10/2006, 14h04
  4. [SQL] probleme de syntaxe sql avec php
    Par kaygee dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 05/06/2006, 15h32
  5. [Ajax] Petit problème avec PHP et AJAX
    Par cerede2000 dans le forum Bibliothèques et frameworks
    Réponses: 9
    Dernier message: 06/05/2006, 18h58

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