2015-07-02 16 views
2

我已經與Postgresql一些工作,但我仍然是一個新手。我通常會默認創建太多查詢,並通過我的方式來獲取查詢所需的結果。這次我想寫一些更精簡的代碼,因爲我將處理一個大型數據庫,並且代碼需要儘可能簡潔。嘗試通過pg_query_params創建和回顯數組

所以我有很多點數據,然後我有很多縣。我有兩個表格,「縣」和「ltg_data」(許多點)。我的目標是通讀指定數量的縣(如數組中給出的)並確定每個縣有多少點。我的新手,這樣的重複和低效的方式是通過編寫查詢這樣的:

$klamath_40_days = pg_query($conn, "SELECT countyname, time from counties, ltg_data where st_contains(counties.the_geom, ltg_data.ltg_geom) and countyname"); 
$klamath_rows = pg_num_rows($klamath_40_days); 

如果我運行像上面的每個縣一個單獨的查詢,它給了我很好的輸出,但它的重複和低效。我寧願使用循環。最終,我需要通過URL將參數傳遞給查詢。當我嘗試在PHP循環運行,我得到的錯誤說:「查詢失敗:ERROR:列‘禪師’不存在」等,這裏的循環:

$counties = array ('Jackson', 'Klamath'); 

foreach ($counties as $i) { 
echo "$i<br>"; 

$jackson_24 = pg_query($conn, "SELECT countyname, time from counties, ltg_data where st_contains(counties.the_geom, ltg_data.ltg_geom) and countyname = ".$i." and time >= (NOW() - '40 DAY'::INTERVAL)"); 
$jackson_rows = pg_num_rows($result); 

} 

echo "$jackson_rows"; 

於是我研究了pg_query_params功能在PHP中,我認爲這會有所幫助。但我運行此腳本:

$counties = array('Jackson', 'Josephine', 'Curry', 'Siskiyou', 'Modoc', 'Coos', 'Douglas', 'Klamath', 'Lake'); 

$query = "SELECT countyname, time from counties, ltg_data where st_contains(counties.the_geom, ltg_data.ltg_geom) and countyname = $1 and time >= (NOW() - '40 DAY'::INTERVAL)"; 

$result = pg_query_params($conn, $query, $counties); 

而且我得到這個錯誤:查詢失敗:ERROR:綁定消息用品9點的參數,而是事先準備好的聲明「」要求1

所以基本上,我想知道什麼是將參數傳遞給postgresql查詢的最佳方式(可能是URL中傳遞參數或數組中的多個元素)?然後我想以有組織的方式迴應總結結果。

感謝您的任何幫助。

回答

1

如果你只需要知道多少分落入一個數組中指定的每個縣,那麼你可以做以下到數據庫中的單個呼叫:

SELECT countyname, count(*) 
FROM counties 
JOIN ltg_data ON ST_contains(counties.the_geom, ltg_data.ltg_geom) 
WHERE countyname = ANY ($counties) 
AND time >= now() - interval '40 days' 
GROUP BY countyname; 

這是更爲比單獨打電話更有效,並且您只返回縣名的單個實例,而不是每個檢索到的記錄的實例。如果你在克拉馬斯國家說了1000分,你只需要返回一次「克拉馬思」,而不是1000次。另外,php不必計算查詢結果的長度。總之更清潔和更快。請注意0​​語法與PostGIS函數調用的組合。

+0

這太好了......謝謝!我很難迴應結果。我使用pg_query和$ result = pg_query($ conn,$ query);並使用while語句while($ row = pg_fetch_row($ result)){echo「$ row [0] $ row [1] \ n」; }它沒有運行或給出任何錯誤。我在這裏做錯了什麼? – user1610717

+0

對不起,在查詢語句末尾錯過了一個分號。還有一些錯誤,但在工作。 – user1610717

+0

啊,對。還要測試'!$ result'來檢查你是否沒有數據庫錯誤。否則你的'while'語句看起來不錯。 – Patrick

1

要在你可以使用下面的模式幾個值的環帶參數執行查詢:

$counties = array('Jackson', 'Josephine', 'Curry'); 
$query = "SELECT countyname, time from counties where countyname = $1"; 

foreach ($counties as $county) { 
    $result = pg_query_params($conn, $query, array($county)); 
    $row = pg_fetch_row($result); 
    echo "$row[0] $row[1] \n"; 
} 

注意的pg_query_params()第三個參數是一個數組,因此你必須把array($county)即使有隻是一個參數。

您也可以使用數組作爲參數執行一個查詢。 在這種情況下,您應該爲數組使用postgres語法並將其作爲文本變量傳遞給查詢。

$counties = "array['Jackson', 'Josephine', 'Curry']"; 
$query = "SELECT countyname, time from counties where countyname = any ($counties)"; 
echo "$query\n\n"; 
$result = pg_query($conn, $query); 
while ($row = pg_fetch_row($result)) { 
    echo "$row[0] $row[1] \n"; 
} 
相關問題