Отправка пустых значений с PDO приводит к ошибке
У нас есть что-то вроде следующего оператора PDO, который мы используем для связи с PostgreSQL 8.4 DB.
$st = $db -> prepare("INSERT INTO Saba.Betriebskosten (personalkosten)
VALUES(:kd_personalkosten)");
$st -> bindParam(':kd_personalkosten', $val['kd_personalkosten']);
$val ['kd_personalkosten'] является либо пустым / нулевым, либо содержит двойное значение. В случае, если он пуст/null, мы просто хотим вставить пустое значение, но получаем следующую ошибку:
SQLSTATE[22P02]: Invalid text representation: 7 ERROR: invalid input syntax for type double precision: '';
, что означает, что пустой/null преобразуется в пустую строку, которая не совместима с полем двойной точности. Как обойти эту ошибку?
1 ответ:
Мне кажется, что значение "" (пустая строка), которое bindParam преобразует в "" в SQL-запросе, и поскольку personalkosten имеет тип Double, это вызывает ошибку.
Это должно исправить эту проблему с пустым текстом для двойного преобразования:
$st -> bindParam(':kd_personalkosten', (float) $val['kd_personalkosten']);
Если вы действительно хотите вставить нулевое значение, когда переменная пуста, то вы должны сделать это:
$value = $val['kd_personalkosten']; if ($value === '' or $value === NULL) { $st->bindValue(':kd_personalkosten', NULL, PDO::PARAM_NULL); // note the bindValue() instead of bindParam() } else { $st->bindParam(':kd_personalkosten', $value); }
О bindValue vs bindParam из руководства php:
BindParam ()
Связывает переменную PHP в соответствующий именной или вопросительный знак заполнитель в инструкции SQL, которая использовалась для подготовки заявление. В отличие от PDOStatement:: bindValue (), переменная связана как ссылка и будет оцениваться только в то время, когда Вызывается PDOStatement:: execute ().
Большинство параметров являются входными, т. е. используется только для чтения, чтобы построить запрос. Некоторые водители поддержка вызова хранимых процедур, возвращающих данные в качестве выходных данных параметры, а некоторые также в качестве входных/выходных параметров, которые оба посылают в данные и обновляются для их получения.
В основном bindValue позволяет привязать прямое значение или константу, в то время как bindParam требует передачи переменной или ссылки.