sql >> Base de Datos >  >> RDS >> Mysql

Mysql/PDO Integrity Violation Duplicate Primary - aunque ya no hay nada en la tabla

Me alegro de que hayas resuelto esto. Sin embargo, esto está destinado a abordar el motivo por qué bindParam() no te funciono No es un error, funciona de esta manera por diseño.

Según los docs :

(énfasis mío)

Considerando lo anterior, esto:

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

... vincularía cada parámetro a $rowvalue por referencia que, en el momento de la ejecución de la consulta, siempre será 1 (el último elemento de $rowdata )

La forma de hacerlo funcionar usando bindParam() sería algo como:

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

...o, tal vez, incluso:

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

... para que cada parámetro haga referencia a la matriz correspondiente elemento .

Una alternativa, como se mencionó anteriormente, sería bindValue() que vincula parámetros por valor en lugar de por referencia. Lo que significa que el parámetro se evaluaría en el momento bindValue() se llama y no en el momento en que realmente se necesita (es decir, la ejecución de la consulta):

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

Por supuesto, la otra alternativa es alimentar execute() con una matriz de parámetros, que permite execute() resolver la parte vinculante (¡por lo tanto, mi favorito personal!) .