Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Mysql/PDO Integrity Violation Duplicate Primary - obwohl nichts bereits in der Tabelle steht

Schön, dass Sie das gelöst haben. Dies soll jedoch den Grund ansprechen warum bindParam() hat bei dir nicht funktioniert. Es ist kein Fehler, es funktioniert so absichtlich.

Gemäß den Dokumenten :

(Hervorhebung von mir)

In Anbetracht des oben Gesagten:

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

...würde jeden Parameter an $rowvalue binden durch Verweis was zum Zeitpunkt der Abfrageausführung immer 1 ist (das letzte Element von $rowdata )

Der Weg, es mit bindParam() zum Laufen zu bringen wäre so etwas wie:

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

...oder vielleicht sogar:

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

...damit jeder Parameter auf das entsprechende Element des Arrays verweist .

Eine Alternative, wie oben zitiert, wäre bindValue() die Parameter nach Wert bindet eher als Referenz. Das bedeutet, dass der Parameter zum Zeitpunkt bindValue() ausgewertet würde aufgerufen wird und nicht zu dem Zeitpunkt, zu dem sie tatsächlich benötigt wird (dh Abfrageausführung):

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

Die andere Alternative ist natürlich das Füttern von execute() mit einem Array von Parametern, das execute() ermöglicht Lösen Sie den Bindungsteil (also mein persönlicher Favorit!) .