2012-08-27 9 views
22

ho avuto un ciclo del genere:PHP DOP BindParam stava cadendo in un foreach

foreach($Fields as $Name => $Value){ 
    $Query->bindParam(':'.$Name, $Value, PDO::PARAM_STR); 
} 

nulla di complicato. Tuttavia, ciascun valore è stato impostato sull'ultimo nell'array ($Fields).

Come posso risolvere il problema?

risposta

39

Tuttavia, grazie a questo guys. Ho scoperto che è necessario passare il valore di riferimento con un & prima del genere:

foreach($Fields as $Name => &$Value){ 
    $Query->bindParam(':'.$Name, $Value, PDO::PARAM_STR); 
} 

Questo mi stava facendo impazzire.

Actual citazione da PHP.net:

Vili 28-mag-2010 12:01

questo funziona ($ val per riferimento):

<?php 
foreach ($params as $key => &$val){ 
    $sth->bindParam($key, $val); 
} 
?> 

Questa volontà fail ($ val by value, perché bindParam ha bisogno della variabile $ &):

<?php 
foreach ($params as $key => $val) { 
    $sth->bindParam($key, $val); 
} 
?> 
+5

Salvato la mia vita. Grazie per aver trovato questo. –

+0

@XyanEwing Prego! –

+2

Quasi sbattuto la mia tastiera nel mio monitor, grazie per averlo salvato! :) –

6

Se non è necessario la capacità di mantenere la variabile in sincronia con il parametro legato prima di eseguire la query (che è il caso il 99,9% del tempo, nella mia esperienza), è probabilmente meglio semplicemente usare PDOStatement::bindValue() invece di PDOStatement::bindParam():

foreach ($Fields as $Name => $Value) { 
    $Query->bindValue(':' . $Name, $Value, PDO::PARAM_STR); 
} 
+0

Grazie per le informazioni, ma sapevo di questo. Questo è il motivo per cui stavo usando il bindParam, ci sono alcuni cambiamenti in seguito nella sceneggiatura. E sto usando bindValue troppo spesso per sapere che bindParam richiedeva un &. –