2013-03-07 41 views
1

我在PostgreSQL中有這個問題,我在解析一個網頁元標記,然後輸入請求到pg_query。爲了簡潔起見,本例中的數據未經過消毒處理。PHP pg_query沒有執行

因此,像這樣:

foreach ($metas as $meta) { 
    $property = $meta->getAttribute('property'); 
    $content = $meta->getAttribute('content'); 

$query = "UPDATE " . $tablename . " SET article_meta = article_meta || '$property=>$content'::hstore where article_id = '{$this -> article_id}' ;"; 

pg_query($conn, $query); 

} 

的問題是,查詢不執行也沒有失敗或拋出任何錯誤。但是,如果我複製已執行的查詢並通過諸如pgadmin之類的方式運行它,它就可以工作。所以查詢不是無效的。任何想法爲什麼發生這種情況?

我應該提到,當我添加觸發器來更新全文搜索tsvector時,此行爲可能已經開始,但我不明白這是如何相關的。

更新

另外我想補充一點,我有一個同步功能是儒,但後來只執行了元標記的分析和查詢工作。所以有些地方阻止了查詢的執行。

+1

你確定嗎?我沒有看到你的代碼中的任何調試?使用'echo pg_last_error($ dbconn);'並再次檢查... – 2013-03-07 11:45:26

+0

這是一個摘錄,有調試,因爲每當查詢失敗,它都會提醒我。 – 2013-03-07 11:54:43

+0

_但是如果我複製查詢..._只是爲了確定。你從哪裏複製了查詢?你'回聲$查詢'? – 2013-03-07 11:57:20

回答

1

現在你說數據塊正在運行,因爲你可以將查詢回顯到屏幕並運行。這大大縮小了可能性。

在我心中,最可能的情況就是您忘記提交您的交易。嘗試:

pg_query('commit'); 

循環後。這可能會解決你的問題。

另一種可能性是連接已關閉,但通常IME至少會引發警告。您可能想要在同一連接上嘗試一些選擇查詢,以確保它是開放的,以確保一切。

最後,您可能想嘗試使用網絡分析器來監視數據庫的流量(假設您沒有使用本地套接字)。這應該讓你更清楚地知道究竟發生了什麼。

+0

這似乎已經做到了!有什麼我應該擔心的性能問題嗎?一般在每個查詢之後應該調用提交嗎? – 2013-03-07 14:58:26

+0

進行提交,您已達到要將所有語句作爲塊回滾或提交的點。性能價格略有降低,但幅度不大。舉例來說,你可能想要確保一堆事情都發生在一起或根本不會發生。該提交在該系列的結尾。 – 2013-03-07 15:11:18

+0

只有在使用BEGIN或START TRANSACTION開始事務時才需要COMMIT。 – 2013-03-07 15:12:43