Das Problem dabei ist, dass Sie Parameter mit bindParam binden , die die Bindung durch Verweis verwendet. In Ihrem Fall sollten Sie bindValue verwenden stattdessen:
foreach( $binders as $key => $value ) {
$sql->bindValue( $key, $value );
}
Oder Sie können Ihr Array direkt an execute() übergeben Methode:
$sql->execute( $binders );
Wie im Handbuch beschrieben:
the variable is bound as a reference and will only be evaluated at the time that PDOStatement::execute() is called.
Wenn also Ihre foreach-Schleife $value endet hat den Wert des letzten Array-Elements Apple . Also beim execute läuft, beide :ctid und :p1 Werte werden gleich Apple . Das ist sicherlich nicht das, was Sie wollen)