Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Mysql/PDO Integrity Violation Duplicate Primary - embora nada já esteja na tabela


Que bom que você resolveu isso. No entanto, isso visa resolver o motivo por que bindParam() não funcionou para você. Não é um bug, funciona dessa maneira por design.

De acordo com os docs :

(ênfase minha)

Considerando o que foi dito acima, isso:
 87                         foreach($rowdata as $rowname => $rowvalue)
 88                         {
 89                                 $stmt->bindParam(':'.$rowname, $rowvalue);
 90                         }

... vincularia todos os parâmetros a $rowvalue por referência que, no momento da execução da consulta, sempre será 1 (o último elemento de $rowdata )

A maneira de fazê-lo funcionar usando bindParam() seria algo como:
 87                         foreach($rowdata as $rowname => $rowvalue)
 88                         {
 89                                 $stmt->bindParam(':'.$rowname, $rowdata[$rowname]);
 90                         }

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

...para que cada parâmetro faça referência ao array correspondente elemento .

Uma alternativa, como citado acima, seria bindValue() que vincula parâmetros por valor em vez de por referência. Significando que o parâmetro seria avaliado no momento bindValue() é chamado e não no momento em que é realmente necessário (ou seja, execução da consulta):
 87                         foreach($rowdata as $rowname => $rowvalue)
 88                         {
 89                                 $stmt->bindValue(':'.$rowname, $rowvalue);
 90                         }

Claro, a outra alternativa é alimentar execute() com uma matriz de parâmetros, que permite execute() resolva a parte de ligação (portanto, meu favorito!) .