2012-01-02 15 views
4

私は日付フィールドを含むcsvデータセットを持っています。私は空かもしれません。(='')。私はこのフィールドにnullを許可するようにPostgresを設定し、それに日付フォーマットを与えました。 PHPインポートスクリプト(下記)を実行すると、空文字列が日付形式ではないため、インポートが失敗します。フィールドが実際に空の場合にのみ実行したいのは、NULLに設定することです。だから私は、私は次のように働くだろうと思っている、条件付きでそれを設定したい:私はこの方法でインポートを実行すると日付フィールドが空の場合、PHPを介してPostgresSQL DBにNULLを挿入してください。

<?php if (empty($data[3])){ 
      $data[3] = NULL; 
     // (i've tried "null", 'null', "NULL", null, etc.) 

、日付フィールドが空の時はいつでも、私はPHP Warning: pg_query(): Query failed: ERROR: invalid input syntax for type date: "NULL"を取得します。 PHPがNULLをpg_queryに渡すことはできませんか?クエリの中に条件付きロジックを置くべきですか?私のコードは以下の通りです。ご指摘ありがとうございました。

<?php 
$conn_string = "host=localhost port=5432 dbname=mydb user=myusername password=mypassword"; 
$_db = pg_connect($conn_string); 

$fileName = "../feeds/stale_prod_report.20111215.csv"; 
$row = 0; 

if ($_db->connect_error) { 
die('Connection Error (' . $_db->connect_errno . ') ' . $_db->connect_error); 
} 

if (($handle = fopen($fileName, "r")) !== FALSE) { 
while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) { 
    $num = count($data); 
    $row++; 
    for ($c=0; $c < $num; $c++) { 
     $data[$c] = pg_escape_string(utf8_encode($data[$c])); 
    } 

    //if date is empty, insert a dummy - not accepting null 
    if (empty($data[16])){ 
     $data[16] = NULL; 
    } 

    if($row !== 1){ 
     pg_query($_db, "INSERT INTO product (first_field, second_field, 
     third_field, my_date) 
    VALUES ('$data[0]', '$data[1]', '$data[2]', '$data[3]')"; 
} 
fclose($handle); 

} else {echo "Could not find the file!";} 
+0

私はpostgresqlに固有のものだと思います。[Postgresql:プリペアドステートメントを使って行を挿入して更新するときにNULL値を使用する](http:// stackoverflow。com/questions/1027499/postgresql-use-update-rows-with-prepared-stateme) - プリペアドステートメントを使用するほうがよいでしょう。エラーまたは間違ったテーブル定義です。 – hakre

答えて

5

あなたの問題は、あなたのSQL内の単一引用符を持っているということです。

INSERT INTO product (first_field, second_field, third_field, my_date) 
VALUES ('$data[0]', '$data[1]', '$data[2]', '$data[3]') 

ので$data[0]が文字列"NULL"であれば、あなたはこれで終わるだろう:

INSERT INTO product (first_field, second_field, third_field, my_date) 
VALUES ('NULL', ... 

、あなた'LL NULLリテラルではなくNULLを含む文字列を挿入しようとしている可能性があります。あなたは、あなたが$data値の内側ではなく、あなたのSQL内で引用行う必要があるでしょう:

# Warning: my PHP is a bit rusty but I think this is right 
if(empty($data[0])) { 
    $data[0] = "NULL"; 
} 
else { 
    $data[0] = "'" . pg_escape_string(utf8_encode($data[$c])) . "'"; 
} 

そしてそれ以降:

pg_query($_db, "INSERT INTO product (first_field, second_field, third_field, my_date) 
    VALUES ($data[0], $data[1], $data[2], $data[3])"; 

以上、PDOに切り替えてプリペアドステートメントを使用します。

+0

引用符で囲まれたさまざまなマシーンは役に立ちませんでしたが、PDOへの全面的な切り替えと準備されたステートメントは魅力的でした。ありがとう。 –

1

使用$data[3] = 'null' - 文字列としてnullを、クエリでそれを挿入したとき、それはnull、ないのように見えるように。

(?あなたは、あなたがそのために同じエラーを得たあなたは確かであることを...しようとしたと述べ、けれども)

EDIT:ああ、あなたのエラーメッセージをよく見てました。データベースの日付フィールドを "nullの可能性がある"値として定義しましたか?私はMySQLに慣れていますが、あなたは気にしています。その部分で間違っている可能性があります。しかし、とにかくヌル日付の表現として'0000-00-00 00:00:00'を挿入してみてください。

4

NULLIF()PostgreSQL関数を使用するマインド。

<?php 
pg_query($_db, "INSERT INTO product (first_field, second_field, third_field, my_date) 
VALUES ('$data[0]', '$data[1]', '$data[2]', NULLIF('$data[3]', ''))"; 
?> 

引数が等しい、すなわち'$データ[3]' == ''、次いでNULL値が返されます。

0

NULLIFのsintaxは、NULLIF( '$ emptysstring'、 ''):: intです。 WHERE ":: int"は相対的な整数です。

私はこれがあなたに役立つことを願っています。がんばろう。

関連する問題