Mysql
 sql >> Database >  >> RDS >> Mysql

Violazione dell'integrità di Mysql/PDO duplicato primario, sebbene nulla sia già presente nella tabella

Sono contento che tu abbia risolto. Tuttavia, questo ha lo scopo di affrontare il motivo perché bindParam() non ha funzionato per te. Non è un bug, funziona in questo modo in base alla progettazione.

Secondo i documenti :

(sottolineatura mia)

Considerando quanto sopra, questo:

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

... legherebbe ogni parametro a $rowvalue per riferimento che, al momento dell'esecuzione della query, sarà sempre 1 (l'ultimo elemento di $rowdata )

Il modo per farlo funzionare usando bindParam() sarebbe qualcosa del tipo:

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

...o, forse, anche:

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

...in modo che ogni parametro faccia riferimento all'array corrispondente elemento .

Un'alternativa, come sopra citato, sarebbe bindValue() che lega i parametri per valore piuttosto che per riferimento. Ciò significa che il parametro verrebbe valutato al momento bindValue() viene chiamato e non nel momento in cui è effettivamente necessario (es. esecuzione della query):

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

Naturalmente, l'altra alternativa è l'alimentazione di execute() con un array di parametri, che consente di execute() risolvere la parte vincolante (quindi il mio preferito!) .