2012-08-27 14 views
22

que tenía un bucle de esa manera:PHP DOP bindParam estaba cayendo en un foreach

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

Nada complicado. Sin embargo, cada valor se estableció en el último en la matriz ($Fields).

¿Cómo puedo solucionar eso?

Respuesta

39

Sin embargo, gracias a esto guys. Me di cuenta de que lo que necesita para pasar el valor de referencia con un & antes de esa manera:

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

Esto me estaba volviendo loco.

cita real de PHP.net:

Vili 28-mayo-2010 12:01

esto funciona ($ val por referencia):

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

Esta voluntad fail ($ val por valor, porque bindParam necesita & $ variable):

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

Me salvó la vida. Gracias por encontrar esto. –

+0

@XyanEwing ¡De nada! –

+2

Casi golpeo mi teclado contra mi monitor, ¡por salvarlo! :) –

6

Si usted no necesita la capacidad de mantener la variable en sincronía con el parámetro de salto antes de ejecutar la consulta (que es el caso del 99,9% de las veces, en mi experiencia), es probablemente mejor simplemente use PDOStatement::bindValue() en lugar de PDOStatement::bindParam():

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

Gracias por la información, pero yo sabía sobre esto. Por eso estaba usando bindParam, hay algunos cambios más adelante en el guión. Y estoy usando bindValue demasiado a menudo que para saber que bindParam requería un &. –