Que bom que você resolveu isso. No entanto, isso visa resolver o motivo por que
bindParam()
não funcionou para você. Não é um bug, funciona dessa maneira por design. De acordo com os docs :
(ênfase minha)
Considerando o que foi dito acima, isso:
87 foreach($rowdata as $rowname => $rowvalue)
88 {
89 $stmt->bindParam(':'.$rowname, $rowvalue);
90 }
... vincularia todos os parâmetros a
$rowvalue
por referência que, no momento da execução da consulta, sempre será 1
(o último elemento de $rowdata
) A maneira de fazê-lo funcionar usando
bindParam()
seria algo como: 87 foreach($rowdata as $rowname => $rowvalue)
88 {
89 $stmt->bindParam(':'.$rowname, $rowdata[$rowname]);
90 }
...ou, talvez, até:
87 foreach($rowdata as $rowname => &$rowvalue)
88 {
89 $stmt->bindParam(':'.$rowname, $rowvalue);
90 }
...para que cada parâmetro faça referência ao array correspondente elemento .
Uma alternativa, como citado acima, seria
bindValue()
que vincula parâmetros por valor em vez de por referência. Significando que o parâmetro seria avaliado no momento bindValue()
é chamado e não no momento em que é realmente necessário (ou seja, execução da consulta): 87 foreach($rowdata as $rowname => $rowvalue)
88 {
89 $stmt->bindValue(':'.$rowname, $rowvalue);
90 }
Claro, a outra alternativa é alimentar
execute()
com uma matriz de parâmetros, que permite execute()
resolva a parte de ligação (portanto, meu favorito!) .