2011-12-16 55 views
2

我們目前正在對數據庫執行搜索並以JSON格式返回結果以在Google地圖上使用。我們所稱的文件名爲getvenues.php,在服務器上效果很好。它接受許多參數並根據查詢返回結果。奇怪的file_get_contents()選項

然後我們有一個單獨的文件,檢查服務器上是否有包含結果的JSON文件,將其年齡與設置匹配,然後從緩存文件返回數據,或者構建新緩存文件是否太舊。

由於有幾千種可能的搜索選項,因此我們只緩存單個搜索(無論是縣,區域還是類型)​​。 JavaScript總是調用我們的search_cache_builder.php文件。如果有多個搜索參數,則該文件只獲取由getvenues.php返回的內容並在沒有任何緩存的情況下提供它。

除了一個特定的組合,一切都很好。如果搜索運行venue_type=Castle/Fortvenue_name=Leeds Castle,則search_cache_builder.php將返回空數組,即使訪問getvenues.php會直接返回所需的數據。

這裏的getvenues.php與此數據>http://dev.weddingvenues.com/lincweb/getvenues.php?type=Castle%20/%20Fort&venue_name=Leeds%20Castle

在這裏工作的樣本是什麼search_cache_builder.php腳本用相同的搜索返回(我們發送的地址是正確的)>http://www.weddingvenues.com/search_cache_builder.php?type=castle%20/%20fort&venue_name=Leeds%20Castle

下面的代碼爲search_cache_builder.php文件,該文件涉及到這個特定的查詢:

$get_string = '?'; 
foreach($_GET as $key => $value) 
{ 
    if($get_string === '?') 
    { 
     $get_string .= $key . '=' . $value; 
    } 
    else 
    { 
     $get_string .= '&' . $key . '=' . $value; 
    } 
} 

//$get_string = str_replace(' ', '', $get_string); 

// Otherwise, we need to serve up the page as is: 
$file_url = GET_VEN_URL . $get_string; 
echo file_get_contents($file_url); 

誰能提供一個解釋,爲什麼search_cache_builder.php文件正在返回一個空數組?

回答

1

您應該urlencode()您的參數值。

事實上,雖然您的getvenues.php直接從瀏覽器接收參數,但它表現正常,因爲它們正確地被urlencoded。

我想接下來我對你的服務的計算機和它的作品:

define ("GET_VEN_URL", "http://www.weddingvenues.com/getvenues.php"); 

$get_string = '?'; 
foreach($_GET as $key => $value) 
{ 
    if($get_string === '?') 
    { 
     $get_string .= $key . '=' . urlencode($value); 
    } 
    else 
    { 
     $get_string .= '&' . $key . '=' . urlencode($value); 
    } 
} 


$file_url = GET_VEN_URL . $get_string; 
echo "<pre>"; 
echo $file_url; 
echo "<pre>"; 

echo file_get_contents($file_url); 
0

首先嚐試urldecode值,然後用http_build_query來生成你的get_string,你的問題必須是值中的特殊字符(如/)。

編輯: 如果你改變工作順序:http://www.weddingvenues.com/search_cache_builder.php?venue_name=Leeds%20Castle&type=castle%20/%20fort

+0

但經營上唯一的城堡/堡搜索工作正常: http://www.weddingvenues.com/search_cache_builder.php ?類型=城堡%20 /%20fort – BenM 2011-12-16 13:01:34

+0

可以是一個雙編碼,我您的評論之前編輯這個答案1秒;如果你改變工作順序) – 2011-12-16 13:02:37

+0

:http://www.weddingvenues.com/search_cache_builder.php? venue_name =利茲%20Castle&類型=城堡%20 /%20fort(必須是在URL編碼) – 2011-12-16 13:04:10

0

因爲$get_string === '?'永遠是假的,將其更改爲==?不是一個布爾值。

我不推薦使用GET參數,&,?作爲文件名的一部分。除此之外,它會很快打到5k(或4k,無法回想)文件名限制。

您可以通過$ GET,md5(或散列)將數組排序爲隨機字符串。
只要您確保散列機制一致,您就可以輕鬆地檢索緩存文件。