2017-01-04 2 views
1

Итак, у меня есть функция php, которая обновляет 2 столбца в базе данных. Это выглядит следующим образом:PHP PDO foreach issue

$fields = array("firstname" => "Joe", "lastname" = "Dunno"); 

$stmt = $connection->prepare("UPDATE users SET firstname = :firstname, lastname = :lastname WHERE user_id = :user_id"); 

foreach ($fields as $key => $value) 
{ 
    $stmt->bindParam(":" . $key, $value); 
} 

$stmt->bindParam(":user_id", $user_id); 

Однако, когда я исполняю заявление по какой-то причине он любит обновлять Firstname и фамилия как в Dunno вместо Джо и Незнайка.

Я попробовал echo'ing $key и $value, и он распечатывается правильно.

По какой-то странной причине, если я использую этот цикл, он работает правильно.

for ($fieldsKeys = array_keys($fields), $x = 0; $x < count($fields); $x++) 
{ 
    $stmt->bindParam(":" . $fieldsKeys[$x], $fields[$fieldsKeys[$x]]); 
} 

ответ

5

bindParam связывается с переменной, поэтому оба поля установлены на одинаковое значение (последнее значение $value). Вы должны использовать bindValue вместо:

$stmt->bindValue(":" . $key, $value); 

В своем коде, PDO вспоминает, что он должен использовать $value переменную для :firstname и :lastname. При времени выполнения инструкции $value равен Dunno, поэтому оба поля получают это значение. Если вы используете bindValue, PDO не запоминает используемую переменную, а ее значение, и это то, что вам нужно.

+0

спасибо. Я приму свой ответ, как только это позволит. – Resantic

+1

В случае, если кто-то найдет его и на самом деле понадобится 'bindParam' (например, если значения в массиве могут измениться до выполнения оператора), вы можете сделать' $ stmp-> bindParam (':'. $ Key, $ поля [$ ключ]); ' – v010dya