РЕШЕНИЕ
Измените это:
foreach($fields as $dbfield => $field) { $value = isset($_POST[$field]) ? 1 : 0; $STH -> bindParam( ':' . $dbfield, $value, PDO::PARAM_INT, 1 ); }
к этому:
foreach($fields as $dbfield => $field) { $value = isset($_POST[$field]) ? 1 : 0; $STH -> bindValue( ':' . $dbfield, $value, PDO::PARAM_INT ); }
ВОПРОС
У меня есть следующий код, который не дает никаких ошибок, но он не делает то, что мне нужно:
PHP
$fields = array( 'db_col_1' => 'cb_1', 'db_col_2' => 'cb_2', 'db_col_3' => 'cb_3' ); $parts = array(); foreach($fields as $dbfield => $field){ $parts[] = '`' . $dbfield . '` = :' . $dbfield; } $DBH = new PDO( "mysql:host=localhost;dbname=db", "user", "pass" ); $DBH -> setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION ); //temp id $id = 1; $STH = $DBH -> prepare( 'UPDATE `table1` SET ' . join(', ', $parts) . ' WHERE `id`= :id' ); $STH -> bindParam( ':id', $id, PDO::PARAM_INT, 10 ); foreach($fields as $dbfield => $field) { $value = isset($_POST[$field]) ? 1 : 0; $STH -> bindParam( ':' . $dbfield, $value, PDO::PARAM_INT, 1 ); } $STH -> execute();
HTML
<input id="cb_1" name="cb_1" type="checkbox" value="cb_1" /> <br /> <input id="cb_2" name="cb_2" type="checkbox" value="cb_2" /> <br /> <input id="cb_3" name="cb_3" type="checkbox" value="cb_3" />
База данных обновляется, но если я поставлю флажки в следующем порядке:
ГОТОВЫЕ ПРОВЕРКИ
cb_1 = 1 cb_2 = 1 cb_3 = 0
Каждый столбец в db получает 0
.
Если я поставлю флажки в следующем порядке:
ГОТОВЫЕ ПРОВЕРКИ
cb_1 = 0 cb_2 = 0 cb_3 = 1
Каждый столбец в db получает 1
.
Кто-нибудь знает, как это исправить?
Может быть, потому, что bindParam
связывает фактическое $value
переменной $value
(по ссылке), которое, по моему мнению, к моменту окончания цикла имеет значение, основанное на $_POST['cb_3']
?
Итак, я думаю, что я должен использовать bindValue
? Но не знаю, как .. Я проверил документацию, но считаю ее запутанной.
PDOStatement :: bindParam () – это способ сообщить PDO: «при последующем выполнении этого утверждения, пожалуйста, прочитайте значение из этой переменной». Это означает, что при вызове $STH -> execute()
$value
должно существовать и должно сохранять свое первоначальное значение.
Поскольку вы используете его таким образом:
foreach($fields as $dbfield => $field) { $value = isset($_POST[$field]) ? 1 : 0; $STH -> bindParam( ':' . $dbfield, $value, PDO::PARAM_INT, 1 ); }
… $value
получает перезапись на каждой итерации цикла, и ваши значения теряются. (Остается только последний).
Вам нужно использовать PDOStatement :: bindValue (), что означает: « Сохраните это значение и используйте его позже, когда вы выполните инструкцию». Таким образом, переменная больше не нужна.