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

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

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

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

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

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


person grssnbchr    schedule 29.11.2012    source источник
comment
что возвращает var_dump($val['kd_personalkosten'])?   -  person Ivan Hušnjak    schedule 29.11.2012
comment
Принимает ли PostgreSQL 8.4 значения NULL для двойной точности?   -  person david strachan    schedule 29.11.2012
comment
@davidstrachan делает, если поле не определено как NOT NULL   -  person Ivan Hušnjak    schedule 29.11.2012
comment
Поля не определены как NOT NULL. @IvanHušnjak строка(0)   -  person grssnbchr    schedule 29.11.2012
comment
@wnstnsmth Если 0.0 является the допустимым значением для пустой строки, преобразование ее в числовое допустимо. Но если пустая строка означает отсутствие значения, вы должны сохранить ее как NULL, как предложил Иван. Очевидно, это будет означать переопределение поля. Если это невозможно, вы можете использовать числовое значение, которое не имеет смысла для вашего приложения. Например, 99999,999.   -  person david strachan    schedule 29.11.2012


Ответы (1)


мне кажется, что это значение "" (пустая строка), которое 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:

привязатьпараметр()

Связывает переменную PHP с соответствующим заполнителем имени или вопросительного знака в операторе SQL, который использовался для подготовки оператора. В отличие от PDOStatement::bindValue(), переменная связана как ссылка и будет оцениваться только во время вызова PDOStatement::execute().

Большинство параметров являются входными параметрами, то есть параметрами, которые используются только для чтения для построения запроса. Некоторые драйверы поддерживают вызов хранимых процедур, возвращающих данные в качестве выходных параметров, а некоторые также в качестве входных/выходных параметров, которые одновременно отправляют данные и обновляются для их получения.

В основном bindValue позволяет вам привязать прямое значение или константу, в то время как bindParam требует передачи переменной или ссылки.

person Ivan Hušnjak    schedule 29.11.2012
comment
Это именно то, что я тоже подозреваю, но это довольно глупое поведение, не так ли? Нет ли способа автоматически преобразовать его в NULL? - person grssnbchr; 29.11.2012
comment
Что касается вашего обновленного ответа: в чем разница между bindValue и bindParam? - person grssnbchr; 29.11.2012
comment
@wnstnsmth: для bindParam требуется переменная, для bindValue нет. - person TheCarver; 11.10.2015