sql >> Database >  >> RDS >> Mysql

Mysql/PDO Integriteitsschending Duplicaat Primair - hoewel er al niets in de tabel staat

Fijn dat je dit hebt opgelost. Dit is echter bedoeld om de reden aan te pakken waarom bindParam() werkte niet voor jou. Het is geen bug, het werkt zo ontworpen.

Volgens de docs :

(nadruk van mij)

Gezien het bovenstaande, dit:

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

...zou elke parameter binden aan $rowvalue op referentie die, op het moment van uitvoering van de query, altijd 1 . zal zijn (het laatste element van $rowdata )

De manier om het te laten werken met bindParam() zou zoiets zijn als:

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

...of misschien zelfs:

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

...zodat elke parameter zou verwijzen naar het corresponderende array element .

Een alternatief, zoals hierboven geciteerd, is bindValue() die parameters bindt op waarde in plaats van door verwijzing. Dit betekent dat de parameter zou worden geëvalueerd op het moment dat bindValue() wordt aangeroepen en niet op het moment dat het echt nodig is (dwz het uitvoeren van een query):

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

Het andere alternatief is natuurlijk het invoeren van execute() met een reeks parameters, waarmee execute() los het bindende deel op (dus mijn persoonlijke favoriet!) .



  1. Converteer geselecteerde kolomwaarden naar een andere rij met behulp van select met dezelfde id part2

  2. Xamp; Apache Poort 80 Bezet

  3. Conversie van MySQL-hoofdlettergevoelige tabellen

  4. Pseudo-kolommen gebruiken met een gekoppelde server