2009-12-21 11 views
1

J'ai une boucle foreach PHP et une instruction d'insertion mysql à l'intérieur de celui-ci. La boucle insère des données dans ma base de données. Je n'ai jamais rencontré ce problème auparavant, mais ce que je pense est que l'insert meurt (je n'ai pas de "ou die" après l'insertion) quand il atteint un enregistrement en double. Même s'il peut y avoir des enregistrements en double dans le tableau, j'ai besoin que cela continue. Y a-t-il quelque chose que je dois spécifier pour le faire?mysql continuer sur les erreurs

Je transfère des enregistrements d'une table à une autre. À l'heure actuelle, j'ai 20 enregistrements dans la table n ° 1 et seulement 17 dans la table n ° 2. Il me manque 3 enregistrements mais un seul d'entre eux est dupliqué ce qui viole la contrainte sur la table. Les deux autres enregistrements auraient dû être ajoutés. Quelqu'un peut-il me donner un conseil ici?

+0

Pourriez-vous s'il vous plaît faire écho les questions et les poster ici? Je soupçonne que quelque chose ne va pas avec les requêtes. –

+0

Vous devez ajouter plus d'informations, telles que la structure de clé de vos deux tables, ainsi que la requête qui copie vos lignes. Je suis d'accord avec les réponses ci-dessous que vous devez comprendre pourquoi les insertions échouent ... un moyen serait de contourner votre dossier de problème connu (crufty) afin que vous puissiez voir pourquoi les autres échouent. – r00fus

Répondre

0

Pas une bonne façon la cause vous devez comprendre ce qui est erroné, mais juste l'empêcher de matriçage essayer d'ajouter @ devant la fonction

@mysql_query = ... 
+0

J'ai déjà essayé mais ça ne marche pas. :( – john

0

Une façon de contourner ce serait simplement interroger la base de données le disque que vous êtes sur le point d'insérer. De cette façon, vos séries de requêtes ne mourront pas lorsque vous tenterez d'insérer un enregistrement en double.

Une solution légèrement plus efficace consisterait à interroger [i] tous les enregistrements que vous êtes sur le point d'insérer dans une requête, à supprimer tous les doublons, puis à insérer les nouveaux.

0

Insérez-vous plusieurs lignes avec une instruction INSERT?

INSERT INTO xyz (x,y,z) VALUES 
    (1,2,3), 
    (2,3,5), 
    (3,4,5), 
    (4,5,6) 

Ensuite, vous pouvez envisager prepared statements
... ou en ajoutant le mot-clé IGNORE à votre instruction INSERT

INSERT IGNORE INTO xyz (x,y,z) VALUES 
    (1,2,3), 
    (2,3,5), 
    (3,4,5), 
    (4,5,6) 

http://dev.mysql.com/doc/refman/5.0/en/insert.html dit:

Si vous utilisez le mot-clé IGNORE, erreurs qui se produisent lors de l'exécution de l'instruction INSERT sont traités comme des avertissements à la place

Vous pouvez toujours récupérer les avertissements mais l'insertion ne sera pas annulée.

0

INSERT INTO FOO (ID, BAR) VALEURS (1,2), (3,4) Duplicate KEY UPDATE BAR = VALEURS (BAR)

1

Ce qui se passe est que PHP est de lancer un avertissement lorsque l'insertion mysql échoue et s'arrête sur cet avertissement. La meilleure façon d'atteindre votre objectif est:

  1. créer un gestionnaire d'exception personnalisée
  2. Set PHP pour utiliser le gestionnaire d'exceptions pour les avertissements.
  3. Enveloppez la tentative d'insertion dans un try/catch
  4. Lorsque vous interceptez l'exception/l'avertissement, consignez ou affichez l'erreur mysql mais continuez l'exécution du script.

Ceci permettra à votre script de continuer sans s'arrêter tout en vous expliquant le problème.

Questions connexes