Mysql
 sql >> Base de données >  >> RDS >> Mysql

Mysql/PDO Integrity Violation Duplicate Primary - bien que rien ne soit déjà dans le tableau

Heureux que vous ayez résolu ce problème. Cependant, cela vise à répondre à la raison pourquoi bindParam() n'a pas fonctionné pour vous. Ce n'est pas un bug, cela fonctionne ainsi par conception.

Selon la docs :

(c'est moi qui souligne)

Compte tenu de ce qui précède, ceci :

 87                         foreach($rowdata as $rowname => $rowvalue)
 88                         {
 89                                 $stmt->bindParam(':'.$rowname, $rowvalue);
 90                         }

... lierait chaque paramètre à $rowvalue par référence qui, au moment de l'exécution de la requête, sera toujours 1 (le dernier élément de $rowdata )

La façon de le faire fonctionner en utilisant bindParam() serait quelque chose comme :

 87                         foreach($rowdata as $rowname => $rowvalue)
 88                         {
 89                                 $stmt->bindParam(':'.$rowname, $rowdata[$rowname]);
 90                         }

...ou, peut-être même :

 87                         foreach($rowdata as $rowname => &$rowvalue)
 88                         {
 89                                 $stmt->bindParam(':'.$rowname, $rowvalue);
 90                         }

...afin que chaque paramètre fasse référence à l'élément du tableau correspondant .

Une alternative, comme cité ci-dessus, serait bindValue() qui lie les paramètres par valeur plutôt que par référence. Ce qui signifie que le paramètre serait évalué au moment bindValue() est appelé et non au moment où il est réellement nécessaire (c'est-à-dire l'exécution de la requête) :

 87                         foreach($rowdata as $rowname => $rowvalue)
 88                         {
 89                                 $stmt->bindValue(':'.$rowname, $rowvalue);
 90                         }

Bien sûr, l'autre alternative est d'alimenter execute() avec un tableau de paramètres, qui permet à execute() résoudre la partie contraignante (donc mon préféré !) .