2009-08-21 24 views
4

postgresデータベースフィールドに日付(「This is a string」)を挿入しようとしています。私は次のエラーを取得しています。ここデータ型timestampのあるpostgresフィールドに日付を入力できません。

ERROR: invalid input syntax for type timestamp: "" 

は私のコード

$date = '2002-03-11'; 

$query = 'INSERT INTO dates(date) VALUES('.$pdo->quote($date).')'; 
$pdo->query($date); 

である私はこれを行う方法について絶対にないアイデアを持っていませんか?

+0

$ pdoはPDOオブジェクトを指していますか?呼び出し元の戻り値は何ですか? – Zed

+0

はい、言及を忘れました。 $ pdoはpdoオブジェクトを指します – Roland

答えて

9

タイムスタンプに挿入しようとしています。時刻と日付を連結する必要があります。オプションAD 又はBC続く任意 時間帯が続く 日付と時刻の連結で構成されたタイムスタンプの種類について

有効な入力、:Postgres documentationから。 (代替的に、AD/BCは 時間帯の前に現れることができ、これは が好ましい順序ではない。)したがって

1999-01-08 04:05:06

1999-01-08 04:05:06 -8:00

、その有効 値でありますISO 8601 規格に従ってください。

の操作を行います。

$date = '2002-03-11 12:01AM'; 
5

私はあなたがそのような空の引用符の値と、そのエラーを取得している理由はわかりません。 PostgreSQLは時間のない日付を確かにタイムスタンプフィールドに受け付けます。デフォルトは、その日の開始時刻である「00:00:00」です。

CREATE TABLE dates("date" timestamp); 
INSERT INTO dates (date) VALUES ('2002-03-11'); 
SELECT * from dates; 
     date   
--------------------- 
2002-03-11 00:00:00 

けれども非常に適切ではない、そのうちの一つは、あなたの状況を改善するかもしれないあなたはここにやっている物事のカップルがあります。

  • 「引用」の代わりに、準備された文での使用実際のアプリケーションは、コードにSQLインジェクション攻撃を許可するための第一歩です。悪い習慣です。ここでエラーが発生しているという事実は、PDOが真ん中で間違ったことをしているのかどうか疑問に思っています。もしあなたがそのステートメントを準備し、その値をより直接的に渡すならば起こりにくいでしょう。
  • ここでは、暗黙のキャストに依存するのではなく、文字列をtimestampに直接キャストする必要があります。ストレートSQLでの例:

    INSERT INTO dates (date) VALUES (cast('2002-03-11' as timestamp)); 
    
  • '日付' はSQL reserved wordです。そのようなフィールドに名前を付けるべきではありません。なぜなら、名前の引用を引用符で囲んで、正しく解析する必要があるからです。

5

あなたのエラーは明らかに問題が何であるかを述べるようだ:

ERROR: invalid input syntax for type timestamp: "" 

あなたのクエリは「タイムスタンプ」の種類を持っているPostgreSQLのフィールドに空の文字列を挿入しようとして表示されます。

ERROR: invalid input syntax for type timestamp: "foobardtimestamp" 

それとも、あなたの期待文字列が渡されていた場合、あなたのケースで、あなたのエラーは次のようになります。あなたはいくつかの種類の無効な文字列を挿入した場合、あなたのようrecievingしていることをエラーに表示されます:

ERROR: invalid input syntax for type timestamp: "2002-03-11" 

...しかし、エラーはあなたが思うように私はあなたの文字列が実際にクエリに渡され取得されていない疑いが作るものを言っていません。 PostgreSQLは、有効なタイムスタンプ文字列として 2002-03-11を完全に処理できるはずです。

PostgreSQLはタイムスタンプとして ''(空の文字列)を挿入するのが好きではなく、入力したエラーに不平を言うでしょう。

空の文字列を指定する場合は、列にNOT NULLという制約がないことを確認し、空の文字列の代わりにnullを使用する必要があります。空の文字列を送信する意味がない場合は、$pdo->quote($date)という値をチェックして、返される文字列を取得していることを確認します。

実際にクエリを実行して正しいかどうかを確認する前に、生成されたSQLを出力することもできます。何が価値があるため、また

INSERT INTO dates(date) VALUES('') 

、あなたの例は、あなたが実行していると言う:私は、あなたがしなければ、それはこのようになります、気持ちを持って $pdo->query($date);、私はかなり確信しているとき、あなたが欲しい:$pdo->query($query);

関連する問題