2

PostgreSQL 8.4 DB との通信に使用する次の PDO ステートメントのようなものがあります。

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

$val['kd_personalkosten'] は空/null であるか、double 値を含んでいます。空/null の場合、空の値を挿入したいだけですが、次のエラーが発生します。

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

つまり、空/null は、倍精度フィールドと互換性のない空の STRING に変換されます。このエラーを回避するにはどうすればよいですか?

4

1 に答える 1

3

SQLクエリでbindParamが""に変換する値は""​​(空の文字列)のようです。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);
}

PHPマニュアルのbindValueとbindParamについて:

bindParam()

PHP変数を、ステートメントの準備に使用されたSQLステートメント内の対応する名前付きまたは疑問符のプレースホルダーにバインドします。PDOStatement :: bindValue()とは異なり、変数は参照としてバインドされ、PDOStatement :: execute()が呼び出されたときにのみ評価されます。

ほとんどのパラメーターは入力パラメーターです。つまり、クエリを作成するために読み取り専用の方法で使用されるパラメーターです。一部のドライバーは、データを出力パラメーターとして返すストアード・プロシージャーの呼び出しをサポートします。また、一部のドライバーは、データを送信し、それを受信するように更新される入出力パラメーターとしてもサポートします。

基本的に、bindValueを使用すると、直接値または定数をバインドできますが、bindParamでは、変数または参照を渡す必要があります。

于 2012-11-29T14:22:57.393 に答える