Masalahnya di sini adalah Anda mengikat parameter dengan bindParam , yang menggunakan pengikatan dengan referensi. Dalam kasus Anda, Anda harus menggunakan bindValue sebagai gantinya:
foreach( $binders as $key => $value ) {
$sql->bindValue( $key, $value );
}
Atau Anda dapat meneruskan array Anda langsung ke execute() metode:
$sql->execute( $binders );
Seperti yang dijelaskan dalam manual:
the variable is bound as a reference and will only be evaluated at the time that PDOStatement::execute() is called.
Jadi ketika loop foreach Anda berakhir $value memiliki nilai item array terakhir Apple . Jadi ketika execute berjalan, keduanya :ctid dan :p1 nilai menjadi sama dengan Apple . Tentunya, ini bukan yang Anda inginkan)