Sono contento che tu abbia risolto. Tuttavia, questo ha lo scopo di affrontare il motivo perché bindParam()
non ha funzionato per te. Non è un bug, funziona in questo modo in base alla progettazione.
Secondo i documenti :
(sottolineatura mia)
Considerando quanto sopra, questo:
87 foreach($rowdata as $rowname => $rowvalue)
88 {
89 $stmt->bindParam(':'.$rowname, $rowvalue);
90 }
... legherebbe ogni parametro a $rowvalue
per riferimento che, al momento dell'esecuzione della query, sarà sempre 1
(l'ultimo elemento di $rowdata
)
Il modo per farlo funzionare usando bindParam()
sarebbe qualcosa del tipo:
87 foreach($rowdata as $rowname => $rowvalue)
88 {
89 $stmt->bindParam(':'.$rowname, $rowdata[$rowname]);
90 }
...o, forse, anche:
87 foreach($rowdata as $rowname => &$rowvalue)
88 {
89 $stmt->bindParam(':'.$rowname, $rowvalue);
90 }
...in modo che ogni parametro faccia riferimento all'array corrispondente elemento .
Un'alternativa, come sopra citato, sarebbe bindValue()
che lega i parametri per valore piuttosto che per riferimento. Ciò significa che il parametro verrebbe valutato al momento bindValue()
viene chiamato e non nel momento in cui è effettivamente necessario (es. esecuzione della query):
87 foreach($rowdata as $rowname => $rowvalue)
88 {
89 $stmt->bindValue(':'.$rowname, $rowvalue);
90 }
Naturalmente, l'altra alternativa è l'alimentazione di execute()
con un array di parametri, che consente di execute()
risolvere la parte vincolante (quindi il mio preferito!) .