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 :

Gestion des erreurs MySQL


Sujet :

PHP & Base de données

  1. #1
    Membre à l'essai
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2019
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Novembre 2019
    Messages : 19
    Points : 15
    Points
    15
    Par défaut Gestion des erreurs MySQL
    Bonjour,

    Je travaille sur un script d'import de données à partir de fichiers .csv, qui fonctionne très bien, et qui génère des alertes javascript lorsque les données sont bien importées et aussi lorsqu'il y a une erreur MySQL.
    Voici à quoi ça ressemble :
    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
     
    // Vérifier si l'importation est demandée & importer les données
    if(isset($_FILES["file"]["tmp_name"]) && $_FILES["file"]["size"] > 0)
    {
        $testfile = $_FILES['file'];
        $_SESSION["i_data"] = $_FILES["file"]["tmp_name"];
     
        $delete_table = "TRUNCATE TABLE " . $_SESSION["table"] . "";
        if(!mysqli_query($mysqli, $delete_table))
        {
            echo "<script type='text/javascript'>
                alert(\"Erreur sur TRUNCATE MySQL : " . mysqli_error($mysqli) ."\");
                window.location = \"accounting.php\"
            </script>";    
        }
     
        if($_FILES["file"]["size"] > 0 && $_SESSION["fis_ref"] == "VEP")
        {
            $file = fopen($_SESSION["i_data"], "r");
            fgetcsv($file, 10000, ";"); // on saute la ligne des en-têtes
            while (($getData = fgetcsv($file, 10000, ";")) !== FALSE)
            {
                $date = implode('-', array_reverse(explode('/', $getData[1])));
                if(strlen($getData[3]) == 7){ $compta = $getData[3] . 0; } else { $compta = $getData[3]; }
                $debit_conv = str_replace(' ', '', $getData[6]);
                $credit_conv = str_replace(' ', '', $getData[7]);
                $debit = str_replace(',', '.', $debit_conv);
                $credit = str_replace(',', '.', $credit_conv);
     
                $sql = "INSERT INTO " . $_SESSION["table"] . " (code_journal, date, num_facture, compte_comptable, compte_auxiliaire, libelle, debit, credit) VALUES ('".$getData[0]."','".$date."','".$getData[2]."','".$compta."','".$getData[4]."','".$getData[5]."','".$debit."','".$credit."')";
                if(!mysqli_query($mysqli, $sql))
                {
                    echo "<script type='text/javascript'>
                    alert(\"Erreur INSERT MySQL : " . mysqli_error($mysqli) ."\");
                    window.location = \"accounting.php#" . $_SESSION["fis_ref"] . "\"
                    </script>";    
                } else {
                    echo "<script type=\"text/javascript\">
                    alert(\"Importation REUSSIE !\");
                    window.location = \"accounting.php#" . $_SESSION["fis_ref"] . "\"
                    </script>";
                }
            }
            fclose($file);  
        }
    ...
    Cependant, lorsque j'importe un mauvais fichier, mysqli_error avec javascript ne se déclenche pas et j'ai l'erreur "brute" suivante :
    Nom : Screenshot 2022-10-06 at 11-31-51 Screenshot.png
Affichages : 324
Taille : 46,3 Ko

    Est-il possible de générer une alerte javascript pour ce type d'erreur ?

    Merci à vous !

    Goo

  2. #2
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 237
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 237
    Points : 8 501
    Points
    8 501
    Billets dans le blog
    17
    Par défaut
    Je ne peux pas tester mysqli et je ne connais pas cette API.

    Une piste serait de changer le comportement de gestion des erreurs et d'émettre une exception plutôt qu'un erreur fatale.

    L'exception pouvant être capturée avec un try/catch, tu pourras ensuite envoyer du JS dans le catch.

    https://www.php.net/manual/fr/mysqli...eport-mode.php

    Exemple de la doc :

    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
    <?php
     
    /* Activation du rapport d'erreur */
    $driver = new mysqli_driver();
    $driver->report_mode = MYSQLI_REPORT_ALL;
     
    try {
        /* si la connexion échoue, une mysqli_sql_exception sera lancé */
        $mysqli = new mysqli("localhost", "my_user", "my_password", "my_db");
     
        /* cette requête devrait rapporter une erreur */
        $result = $mysqli->query("SELECT Name FROM Nonexistingtable WHERE population > 50000");
     
        /* cette requête devrait rapporter un mauvais index, si la colonne population n'a pas d'index */
        $result = $mysqli->query("SELECT Name FROM City WHERE population > 50000");
    } catch (mysqli_sql_exception $e) {
        error_log($e->__toString());
    }

  3. #3
    Membre à l'essai
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2019
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Novembre 2019
    Messages : 19
    Points : 15
    Points
    15
    Par défaut
    Citation Envoyé par Séb. Voir le message
    Je ne peux pas tester mysqli et je ne connais pas cette API.

    Une piste serait de changer le comportement de gestion des erreurs et d'émettre une exception plutôt qu'un erreur fatale.

    L'exception pouvant être capturée avec un try/catch, tu pourras ensuite envoyer du JS dans le catch.

    https://www.php.net/manual/fr/mysqli...eport-mode.php
    Merci Séb !
    J'ai passé du temps cet après-midi à mettre le code à jour avec PDO justement pour tester la gestion des erreurs, comme tu le proposes !
    J'ai pas fini, mais ça ne saurait tarder !
    Tout ça me conforte ^^
    On en reparle demain !
    Bonne soirée !

Discussions similaires

  1. Gestion des erreurs MySQL
    Par Invité dans le forum VBScript
    Réponses: 2
    Dernier message: 09/04/2019, 17h35
  2. Problème de gestion des erreurs MySQL
    Par Crygamers dans le forum Langage
    Réponses: 2
    Dernier message: 09/07/2012, 13h50
  3. [MySQL] gestion des erreurs mysql
    Par Abou Zar dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 27/01/2010, 12h52
  4. gestion des erreurs mysql
    Par PAYASS59 dans le forum Administration
    Réponses: 1
    Dernier message: 04/07/2008, 08h54
  5. gestion des erreurs mysql
    Par sefir dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 12/12/2007, 13h23

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