Отправка пустых значений с результатами PDO с ошибкой

У нас есть что-то вроде следующего PDO Statement, которое мы используем для связи с DB PostgreSQL 8.4.

$st = $db -> prepare("INSERT INTO Saba.Betriebskosten (personalkosten) VALUES(:kd_personalkosten)"); $st -> bindParam(':kd_personalkosten', $val['kd_personalkosten']); 

$ val ['kd_personalkosten'] либо пуст / null, либо содержит двойное значение. В случае, если он пуст / null, мы просто хотим вставить пустое значение, но получим следующую ошибку:

 SQLSTATE[22P02]: Invalid text representation: 7 ERROR: invalid input syntax for type double precision: ''; 

Это означает, что empty / null преобразуется в пустой STRING, который несовместим с полем двойной точности. Как обойти эту ошибку?

Related of "Отправка пустых значений с результатами PDO с ошибкой"

мне кажется, что значение равно «» (пустая строка), которое bindParam преобразует в «» в SQL-запрос, а поскольку personalkosten имеет тип Double, он вызывает ошибку.

Это должно устранить эту проблему с пустым текстом для двойного преобразования:

 $st -> bindParam(':kd_personalkosten', (float) $val['kd_personalkosten']); 

Если вы действительно хотите вставить значение NULL, когда переменная пуста, вы должны сделать следующее:

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