2009-08-21 46 views
4

我試圖插入一個日期(「這是一個字符串」)到Postgres數據庫字段。我收到以下錯誤無法輸入日期到數據類型時間戳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 2009-08-21 12:58:53

+0

是的,忘記提及。 $ pdo指向pdo對象 – Roland 2009-08-21 13:00:09

回答

9

您試圖插入時間戳。您需要將時間與日期連接起來。從Postgres documentation:用於時間戳類型 由一個日期 和一個時間的連接的,隨後任選 時區

的有效輸入,接着任選的AD 或BC。 (可替換地,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是否在這裏的中間做了錯誤的事情,如果你準備好了這個聲明並且更直接地通過了這個值,那麼這種情況就不太可能發生。
  • 你真的應該直接從字符串轉換爲時間戳,而不是依賴這裏的隱式轉換。例如,在直SQL:

    INSERT INTO dates (date) VALUES (cast('2002-03-11' as timestamp)); 
    
  • '日期' 是一個SQL reserved word。您不應該這樣命名字段,因爲您最終可能需要將引用中的名稱用引號引起來才能正確解析。

5

你的錯誤似乎清楚地說明是什麼問題:

ERROR: invalid input syntax for type timestamp: "" 

看來你的查詢試圖插入一個空字符串成具有類型「時間戳」的PostgreSQL的領域。如果你將某種類型的無效的字符串,它應該出現在錯誤您所recieving喜歡:

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

或者,你的情況,如果你期望的字符串被傳遞,您的錯誤可能是這個樣子:

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);

相關問題