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:
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
}
} |
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 ?
Voici la proposition de... ChatGPT
Par jeu, j'ai aussi interrogé ChatGPT. Voici ce qui m'a été proposé :
Code:
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 :
Citation:
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.