2013-02-20 3 views
0

J'ai une instruction MySQL DELETE suivie d'une instruction INSERT pour assurer une seule copie d'un ensemble de données pour un ID donné. (Il y a une raison pour laquelle je n'utilise pas UPDATE)MySQL DELETE échoue aléatoirement et très rarement

Le problème est que j'ai remarqué dans un ensemble de données couvrant plus de 5000 entrées qu'il y a 3 instances où l'instruction DELETE ne s'est pas exécutée, mais l'instruction INSERT l'a fait. Le résultat final était des entrées en double pour les ID donnés.

Voici mon code. Lors de l'échec de l'exécution, le script PHP quittera avec un message d'erreur. Ça doit être mon niveau d'expérience. Des idées quel pourrait être le problème?

//delete 
$query_delete = "DELETE FROM q1_6_list WHERE q_id = '".mysql_real_escape_string($q[qID])."'"; 
$result = mysql_query($query_delete) or errorReport("Error in query: $query_delete. ".mysql_error()); 
//insert 
$query_insert = "INSERT INTO q1_6_list (q_id, vehicle, quantity) VALUES"; 
$result = mysql_query($query_insert) or errorReport("Error in query: $query_insert. ".mysql_error()); 
if (!$result) 
    errorReport($result); 

EDIT

regardant de plus près, j'ai remarqué que je ne l'ai pas ajouter le code ci-dessous juste après $result = mysql_query($query_delete)....

if (!$result) 
    errorReport($result); 

pourrait-il être aussi nécessaire pour attraper tous les autres messages d'erreur, ou mysql_query($query_delete) or errorReport... attraper toutes les occurrences d'erreur?

+2

bug mineur: '$ q [qid]' devrait être '$ q [ 'qid'] '. cela peut exploser spectaculairement sur votre si vous avez réellement une constante nommée 'qID' - php traitera les constantes non définies comme une chaîne sans guillemets dans le contexte de la clé du tableau, mais si la constante existe ... boom. De plus, quel est exactement le message d'erreur? Ne nous laissez pas pendre ... –

+0

@MarcB J'aimerais que ce soit 'E_ERROR' au lieu de' E_NOTICE'. –

+0

En fait, il n'y a aucun message d'erreur que je pourrais tracer. Il est renvoyé à l'application des utilisateurs. Je ne vois rien non plus dans error_log.txt pour cette ligne de code. – Rynardt

Répondre

0

Vous pouvez simplement exécuter la requête d'insertion que si requête de suppression a réussi:

if (mysql_query($query_delete)) { 
    mysql_query($query_insert); 
} 
1

Votre meilleur pari ici est de créer une clé primaire sur q1_6_list (q_id):

ALTER TABLE q1_6_list ADD PRIMARY KEY(q_id) 

et utiliser MySQLs syntaxe REPLACE INTO, donc perdre votre suppression et votre insert devient:

$query_insert = "REPLACE INTO q1_6_list (q_id, vehicle, quantity) VALUES";