我们目前正在对数据库执行搜索并以JSON格式返回结果以在Google地图上使用。我们调用的文件名为getvenues.php
,在服务器上运行良好。它接受许多参数并根据查询返回结果。
然后我们有一个单独的文件,检查服务器上是否有JSON
文件,其中包含结果,将其年龄与设置相匹配,然后从缓存文件或构建中返回数据一个新的缓存文件,如果它太旧了。
由于有几千个可能的搜索选项,我们只缓存单个搜索(在县,区域或类型上)。 JavaScript始终调用我们的search_cache_builder.php
文件。如果有多个搜索参数,则该文件只会获取getvenues.php
返回的内容,并在没有任何缓存的情况下提供它。
除了一个特定的组合外,一切都很好。如果针对venue_type=Castle / Fort
和venue_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
文件返回一个空数组吗?
答案 0 :(得分: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);
答案 1 :(得分:0)
首先尝试urldecode值,然后使用http_build_query生成你的get_string,你的问题必须是值中的特殊字符(比如/).
编辑: 如果您更改其有效的顺序:http://www.weddingvenues.com/search_cache_builder.php?venue_name=Leeds%20Castle&type=castle%20/%20fort
答案 2 :(得分:0)
由于$get_string === '?'
始终为false,因此将其更改为==
,?
不是布尔值。
我不建议使用GET参数,&
,?
作为文件名的一部分。
除此之外,它将很快达到文件名的5k(或4k,无法召回)限制。
您可以通过$ GET,md5(或哈希)将数组排序为随机字符串 只要确保散列机制一致,就可以轻松检索缓存文件。