यहां समस्या यह है कि आप पैरामीटर को bindParam . के साथ बाध्य कर रहे हैं , जो संदर्भ द्वारा बाध्यकारी का उपयोग करता है। आपके मामले में आपको bindValue . का उपयोग करना चाहिए इसके बजाय:
foreach( $binders as $key => $value ) {
$sql->bindValue( $key, $value );
}
या आप अपनी सरणी को सीधे execute() . पर पास कर सकते हैं विधि:
$sql->execute( $binders );
जैसा कि मैनुअल में वर्णित है:
the variable is bound as a reference and will only be evaluated at the time that PDOStatement::execute() is called.
इसलिए जब आपका फ़ोरैच लूप $value ends समाप्त होता है अंतिम सरणी आइटम का मान है Apple . तो जब execute रन, दोनों :ctid और :p1 मान Apple . के बराबर होते जा रहे हैं . निश्चित रूप से, यह वह नहीं है जो आप चाहते हैं)