2010-12-07 47 views
0

J'ai une colonne unique. Si je comprends bien, lorsque vous essayez d'insérer des données dans cette colonne qui ne respectent pas son unicité, la requête cesse d'être traitée. Ce que je veux faire est simplement capturer l'erreur et continuer avec le reste des rangées. Comment le feriez-vous de la manière la plus efficace en utilisant PHP et MySQL?Erreur de capture et continue lors de l'insertion dans une colonne unique

ici vous avez un court exemple http://pastie.org/1357001

vraiment ce que je me demandais est la boucle qui va se casser si une erreur se produit?

+1

hmmm ... la requête ** ne s'arrêtera pas ** de se faire traiter à moins que vous n'ayez ordonné à PHP de le faire, extrait de code? – ajreal

+0

Quel code avez-vous jusqu'à présent? –

+0

a mis à jour sa question – Breezer

Répondre

1

Vous devriez être en mesure de rattraper cette erreur:

try { 
    // execute SQL query for one record 
} catch(Exception $e) { 
    // handle error here 
} 
+0

ne va-t-il pas casser la boucle si une erreur se produit – Breezer

+0

Non, d'où le nom Catch. – RobertPitt

+0

ah bien sûr j'avais juste peur que la requête arrête de fonctionner si une erreur est survenue – Breezer

2

Je suis avec ajreal sur celui-ci. La violation d'une contrainte ne doit pas provoquer d'exception en PHP. Vous pouvez tester la valeur de retour de mysqli_stmt::execute, ou quoi que ce soit que vous utilisez, et de traiter avec des erreurs qui se sont produites:

$mysqli = new mysqli('host', 'user', 'password', 'db'); 

// Prepare an INSERT; 
$stmt = $mysqli->prepare('INSERT INTO mytable (id, data) VALUES (?, ?)'); 
$data = 'Some data'; 

// Insert 3 rows. 
for ($id = 1; $id <= 3 ; $id++) { 

    // Attempt to insert each row twice. 
    for ($test = 1; $test <= 2; $test++) { 

     // Bind the ID and data. 
     $stmt->bind_param('is', $id, $data); 

     // Execute the statement. 
     if ($stmt->execute()) { 
      // No error. 
      echo "Inserted row ID $id\n"; 
     } else { 
      // An error, but no exception. 
      printf(
       "Error %d inserting row ID %d: %s\n", 
       $stmt->errno, 
       $id, 
       $stmt->error 
      ); 
     } 
    }  
} 

Prints:

Inserted row ID 1 
Error 1062 inserting row ID 1: Duplicate entry '1' for key 'PRIMARY' 
Inserted row ID 2 
Error 1062 inserting row ID 2: Duplicate entry '2' for key 'PRIMARY' 
Inserted row ID 3 
Error 1062 inserting row ID 3: Duplicate entry '3' for key 'PRIMARY' 
+0

mais je veux capturer l'erreur s'il y en a – Breezer

+0

@Breezer: J'ai mis à jour ma réponse. – Mike

1
foreach($somethings as $something) 
{ 
    try 
    { 
     //mysql_query 
    } 
    catch(Exception $e) 
    { 
     $failed[] = $e; 
     continue; 
    } 

    //process anything else. 
} 

exceptions sont les marche à suivre.

+0

merci de prendre votre temps =) l'apprécier – Breezer