У нас есть что-то вроде следующего 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, который несовместим с полем двойной точности. Как обойти эту ошибку?
мне кажется, что значение равно «» (пустая строка), которое 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 требует передачи переменной или ссылки.