РЕШЕНИЕ
Измените это:
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 (), что означает: « Сохраните это значение и используйте его позже, когда вы выполните инструкцию». Таким образом, переменная больше не нужна.