Отправка пустых значений с 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 2

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 требует передачи переменной или ссылки.