Cieszę się, że to rozwiązałeś. Ma to jednak na celu rozwianie powodu dlaczego bindParam() nie pracował dla ciebie. To nie jest błąd, działa w ten sposób zgodnie z projektem.
Zgodnie z dokumentacją :
(podkreślenie moje)
Biorąc pod uwagę powyższe, to:
87 foreach($rowdata as $rowname => $rowvalue)
88 {
89 $stmt->bindParam(':'.$rowname, $rowvalue);
90 }
...powiąże każdy parametr z $rowvalue przez odniesienie która w momencie wykonania zapytania zawsze będzie wynosić 1 (ostatni element $rowdata )
Sposób, aby to działało za pomocą bindParam() byłoby coś w stylu:
87 foreach($rowdata as $rowname => $rowvalue)
88 {
89 $stmt->bindParam(':'.$rowname, $rowdata[$rowname]);
90 }
...a może nawet:
87 foreach($rowdata as $rowname => &$rowvalue)
88 {
89 $stmt->bindParam(':'.$rowname, $rowvalue);
90 }
...aby każdy parametr odwoływał się do odpowiedniej tablicy elementu .
Alternatywą, jak zacytowałem powyżej, byłaby bindValue() który wiąże parametry według wartości a nie przez odniesienie. Oznacza to, że parametr będzie oceniany w czasie bindValue() jest wywoływana, a nie w momencie, w którym jest to faktycznie potrzebne (tj. wykonanie zapytania):
87 foreach($rowdata as $rowname => $rowvalue)
88 {
89 $stmt->bindValue(':'.$rowname, $rowvalue);
90 }
Oczywiście inną alternatywą jest karmienie execute() z tablicą parametrów, która pozwala execute() rozwiązać część wiążącą (a więc mój osobisty faworyt!) .