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!) .