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 :

PDO : traiter une entrée dupliquée dans une boucle


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Webmaster
    Inscrit en
    Février 2020
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Février 2020
    Messages : 11
    Par défaut PDO : traiter une entrée dupliquée dans une boucle
    Bonsoir,

    j'ai trouvé ici même du code proposé par un modérateur, dans un autre post.

    CONTEXTE
    Je passe en revue des éléments d'un ARRAY : nom / prenom / email / ville pour tenter de les transformer en enregistrements avec PDO.
    'email' peut être utilisé comme un identifiant unique. Si aucun enregistrement ne contient 'email' que je pointe, OK pour INSERT.
    Dans la solution proposée ci-dessous, je ne sais pas comment gérer le "Faire quelque chose dans le cas d'une entrée dupliquée"...

    PROBLEME A RESOUDRE
    Si l'INSERT n'est pas opéré parce que 'email' est déjà enregistré et donc errorInfo 1062, comment dire, "OK, alors tu t'occupes du suivant" ?

    STRUCTURE de CODE proposée (mais je n'ai pas la compétence pour l'exploiter)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    $prep= $bdd->prepare('...')
    try {
       $prep->execute(array('...'));
       // Insertion réussi , on fait ce qu'on à faire
    } catch (PDOException $e) {
       if ($e->errorInfo[1] == 1062) { //1062 correspond à une entrée dupliquée
          //Faire quelque chose dans le cas d'une entrée dupliquée
       } else {
          // une autre erreur
       }
    }

  2. #2
    Expert confirmé
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 670
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 670
    Par défaut
    montrez nous le code de la boucle qui parcourt le tableau.

  3. #3
    Membre averti
    Homme Profil pro
    Webmaster
    Inscrit en
    Février 2020
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Février 2020
    Messages : 11
    Par défaut
    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
    $i = 1;
    foreach($response["data"] as $key => $value){
     
        $SendingId =  $response["data"][$i]["SendingId"] ;     
        $EventType =  $response["data"][$i]["EventType"] ;    
        $EventEmail =  $response["data"][$i]["EventEmail"] ;
        $horodatage = $response["data"][$i]["EventDate"] ;
        $Timestamp = strtotime ($horodatage);    $NomNewsletter = $response["data"][$i]["EventInfos"]["EmailingName"] ;
        $URL = $response["data"][$i]["EventInfos"]["URL"];
        $IP = $response["data"][$i]["EventInfos"]["IP"];
        $Type = $response["data"][$i]["EventInfos"]["Type"];
     
        /* CODE POUR CREER ENREGISTREMENT UNIQUE testé ailleurs OK lorsque valeurs passées par 1 formulaire. */
        /* Mais PAS encore opérationnel dans cette boucle */
        /*
        $sql*=*"INSERT*INTO*tracking*(Timestamp,*SendingId,*EventType, EventEmail, NomNewsletter, URL, IP, Type )*VALUES*(?,?,?,?,?,?,?,?)";
        $stmt=*$pdo->prepare($sql);
        
        try {
           $stmt->execute([$Timestamp, $SendingId, $EventType, $EventEmail, $NomNewsletter, $URL, $IP, $Type]);
           // Insertion réussi , on fait ce qu'on à faire
        } catch (PDOException $e) {
           if ($e->errorInfo[1] == 1062) { //1062 correspond à une entrée dupliquée
              //Faire quelque chose dans le cas d'une entrée dupliquée
              echo "erreur entrée dupliquée" ; // AFFICHER CE MESSAGE n'est PAS SUFFISANT. Là, je dois passer à l'item suivant pour tenter de faire un INSERT
           } else {
              // une autre erreur
              echo "ça a marché" ; // MESSAGE OK, mais est-ce que je vais passer à l'item suivant pour tenter l'INSERT ?
           }
        }
        */
        /* FIN ENREGISTREMENT UNIQUE */
     
     
        $i++;
      }

  4. #4
    Expert confirmé
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 670
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 670
    Par défaut
    dans le "if" qui indique qu'une adresse e-mail existe déjà, vous pouvez par exemple stocker l'adresse e-mail dans un tableau php.
    et ensuite à la fin du traitement, vous pouvez par exemple rediriger vers une page qui indique la liste de ses adresses qui ont un souci.

    est ce que vous êtes sur que le code d'erreur "1062" est fiable pour tester l'existence ? j'aurai plutot faire une requête select pour voir si un enregistrement existe déjà avec cette adresse.

  5. #5
    Membre averti
    Homme Profil pro
    Webmaster
    Inscrit en
    Février 2020
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Février 2020
    Messages : 11
    Par défaut est-ce une bonne stratégie ?
    Cette stratégie n'est pas de moi. Elle provient d'un échange riche sur ce même forum :
    https://www.developpez.net/forums/d1...ase-insertion/

    @mathieu : est-ce une bonne stratégie ?

  6. #6
    Membre averti
    Homme Profil pro
    Webmaster
    Inscrit en
    Février 2020
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Février 2020
    Messages : 11
    Par défaut Voici la proposition de... ChatGPT
    Par jeu, j'ai aussi interrogé ChatGPT. Voici ce qui m'a été proposé :
    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
    50
    51
    52
    53
    54
    55
    56
    57
    <?php
     
    // define database connection variables
    $servername = "localhost";
    $username = "your_username";
    $password = "your_password";
    $dbname = "your_database_name";
     
    // create a PDO connection
    try {
        $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
        $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    } catch(PDOException $e) {
        echo "Connection failed: " . $e->getMessage();
        exit;
    }
     
    // define the arrays to be inserted
    $array1 = array("id" => 1, "name" => "John Doe");
    $array2 = array("id" => 2, "name" => "Jane Smith");
    $array3 = array("id" => 3, "name" => "Bob Johnson");
     
    // create an array of all the arrays to be inserted
    $all_arrays = array($array1, $array2, $array3);
     
    // loop through each array and insert into the database
    foreach ($all_arrays as $array) {
        $id = $array['id'];
        $name = $array['name'];
     
        try {
            // prepare the SQL statement for insertion
            $stmt = $conn->prepare("INSERT INTO your_table_name (id, name) VALUES (:id, :name)");
     
            // bind the parameters to the SQL statement
            $stmt->bindParam(':id', $id);
            $stmt->bindParam(':name', $name);
     
            // execute the SQL statement
            $stmt->execute();
        } catch (PDOException $e) {
            // if there is a duplicate entry error, continue to the next array
            if ($e->getCode() == 23000) {
                continue;
            }
            // if there is another error, print the error message and exit the script
            else {
                echo "Error: " . $e->getMessage();
                exit;
            }
        }
    }
     
    // close the database connection
    $conn = null;
     
    ?>
    Avec le commentaire suivant :
    Dans cet exemple, nous créons d'abord une connexion PDO à la base de données. Nous définissons ensuite les tableaux à insérer et créons un tableau de tous les tableaux. Nous parcourons chaque tableau et préparons une instruction SQL pour l'insertion, lions les paramètres à l'instruction SQL et exécutons l'instruction SQL. S'il y a une erreur d'entrée en double, nous passons simplement au tableau suivant. S'il y a une autre erreur, nous imprimons le message d'erreur et quittons le script. Enfin, nous fermons la connexion à la base de données.

Discussions similaires

  1. code n'entre pas dans les boucles if
    Par ahmednaess dans le forum C
    Réponses: 10
    Dernier message: 16/05/2013, 15h01
  2. Réponses: 4
    Dernier message: 20/04/2010, 11h24
  3. Réponses: 10
    Dernier message: 07/04/2010, 11h07
  4. Insérer <form> dans une boucle for et traiter par POST
    Par IRONicMAN dans le forum Langage
    Réponses: 10
    Dernier message: 26/03/2010, 14h09
  5. [Batch] Modification des paramètres d'entrée dans une boucle FOR
    Par reppier dans le forum Scripts/Batch
    Réponses: 2
    Dernier message: 15/06/2009, 15h23

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