php pdo: prepare() отрицательные значения становятся положительными

Я использую подготовленный оператор для вставки значений из формы в базу данных, и некоторые значения отрицательны.

# html
<input type="radio" name="opinion" value='-2' />
<input type="radio" name="opinion" value='-1' />
<input type="radio" name="opinion" value='0' />
<input type="radio" name="opinion" value='1' />
<input type="radio" name="opinion" value='2' />

# prepare
prepare("UPDATE $db.$dbt SET $question = :value WHERE `key` = :key;");

Уже предпринятые шаги по устранению неполадок:
• Я повторил значения POSTed из формы, и отрицательные значения вернули отрицательный результат.
• Я скопировал оператор в prepare() в CLI и вручную вставил отрицательное значение. значение в тот же столбец, где prepare вставляет положительное значение:
UPDATE db.dbt SET opinion = '-1' WHERE key = '10101'; (галочки присутствуют в реальном SQL)
^ Это сработало.
• Я распечатывал подготовленные операторы по мере их выполнения и Я заметил, что значения не заключены в кавычки. Я думаю, проблема именно в этом.

Я читал, что значения не должны заключаться в prepare(), поэтому я не могу придумать, что еще можно сделать…

EDIT: prepare() находится внутри цикла

foreach ( $pairs as $pair ) {
    list($question , $answer) = explode('=', $pair);
    try {
        $record_data = $dbh->prepare("UPDATE $db.$dbt SET $question = :value WHERE `key` = :key;");
        $record_data->bindParam(':value', $answer);
        $record_data->bindParam(':key', $key);
        $record_data->execute();
    } catch(PDOException $e){};
} // end foreach

person Jakob Jingleheimer    schedule 28.11.2011    source источник
comment
@Pekka: МАЛЕНЬКИЙ (4). Я думал, что это может быть проблема с типом поля, но я думаю, что увижу ту же проблему при ручном запуске SQL в CLI (и, таким образом, отрицательное число не будет успешно вставлено).   -  person Jakob Jingleheimer    schedule 28.11.2011


Ответы (1)


Если вы используете PDO: -

$sth->bindParam(':value', $opinion, PDO::PARAM_INT);

Тип данных по умолчанию для bindParam — PDO::PARAM_STR.

person ajreal    schedule 28.11.2011
comment
Есть ли способ сделать это более динамично? (Не все значения являются целыми числами, а prepare находится в цикле). - person Jakob Jingleheimer; 28.11.2011
comment
Добавил к вопросу. Спасибо! - person Jakob Jingleheimer; 28.11.2011
comment
Ну, не так уж сложно, измените две строки bindParam и снова проверьте - person ajreal; 28.11.2011
comment
Если я добавлю PDO::PARAM_STR к привязке, не будет ли это ошибочно идентифицировать нецелочисленные значения в остальной части формы? - person Jakob Jingleheimer; 28.11.2011
comment
прочитайте внимательно, попросив установить PDO::PARAM_INT, в то время как тип данных по умолчанию PDO::PARAM_STR - person ajreal; 28.11.2011
comment
о, да, извините, я скопировал не то. не будет ли указание PDO::PARAM_INT неверно идентифицировать нецелочисленные значения? (или он поймет, что текст не является целым числом)? - person Jakob Jingleheimer; 28.11.2011
comment
Итак, я бы каким-то образом выяснил тип данных текущего значения в цикле foreach и установил PDO::PARAM_INT, когда это целое число? - person Jakob Jingleheimer; 28.11.2011