Kul att du löste detta. Detta är dock tänkt att åtgärda orsaken varför bindParam()
fungerade inte för dig. Det är inte en bugg, det fungerar på det här sättet.
Enligt dokumenten :
(min betoning)
Med tanke på ovanstående, detta:
87 foreach($rowdata as $rowname => $rowvalue)
88 {
89 $stmt->bindParam(':'.$rowname, $rowvalue);
90 }
...skulle binda varje parameter till $rowvalue
genom referens som vid tidpunkten för exekveringen av frågan alltid kommer att vara 1
(det sista elementet i $rowdata
)
Sättet att få det att fungera med bindParam()
skulle vara något i stil med:
87 foreach($rowdata as $rowname => $rowvalue)
88 {
89 $stmt->bindParam(':'.$rowname, $rowdata[$rowname]);
90 }
...eller kanske till och med:
87 foreach($rowdata as $rowname => &$rowvalue)
88 {
89 $stmt->bindParam(':'.$rowname, $rowvalue);
90 }
...så att varje parameter skulle referera till motsvarande array element .
Ett alternativ, som citerats ovan, skulle vara bindValue()
som binder parametrar efter värde snarare än genom referens. Det betyder att parametern skulle utvärderas vid tiden bindValue()
anropas och inte vid den tidpunkt det faktiskt behövs (dvs. exekvering av en fråga):
87 foreach($rowdata as $rowname => $rowvalue)
88 {
89 $stmt->bindValue(':'.$rowname, $rowvalue);
90 }
Naturligtvis är det andra alternativet att mata execute()
med en array av parametrar, som låter execute()
lösa den bindande delen (därav min personliga favorit!) .