奇怪的file_get_contents()选项

时间:2011-12-16 12:30:35

标签: php json file-get-contents

我们目前正在对数据库执行搜索并以JSON格式返回结果以在Google地图上使用。我们调用的文件名为getvenues.php,在服务器上运行良好。它接受许多参数并根据查询返回结果。

然后我们有一个单独的文件,检查服务器上是否有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文件返回一个空数组吗?

3 个答案:

答案 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(或哈希)将数组排序为随机字符串 只要确保散列机制一致,就可以轻松检索缓存文件。