Intereting Posts
phpStorm запрашивает встроенный интерпретатор php-cgi. Как сделать php как быстрый cgi? Регистрация Fitbit oauth Заголовки для вывода изображения PNG, чтобы убедиться, что он кэшируется в браузере? Получение Facebook как счет Как разобрать текст с ключом по столбцу с возможными многострочными строками Безопасные альтернативы PHP Globals (хорошая практика кодирования) динамически масштабировать изображения в php jpg / png / gif Проблема дублирования электронной почты PHPmailer – условная заявка с помощью $ mail-> Отправить () Обработка ошибок в PHP Использование extract () с дефисами Как начать и завершить транзакцию в mysqli? Как создать субдомен с именем пользователя в качестве имени поддомена? Каковы различия между этими алгоритмами шифрования? Какой лучший метод PHP для уменьшения размера изображения без потери качества Как конвертировать из родного php в codeigniter

PHP PDO с bindParam vs bindValue?

РЕШЕНИЕ

Измените это:

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 ? Но не знаю, как .. Я проверил документацию, но считаю ее запутанной.

Solutions Collecting From Web of "PHP PDO с bindParam vs 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 (), что означает: « Сохраните это значение и используйте его позже, когда вы выполните инструкцию». Таким образом, переменная больше не нужна.