【问题标题】:Weird file_get_contents() options奇怪的 file_get_contents() 选项
【发布时间】:2011-12-16 12:30:35
【问题描述】:

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

然后我们有一个单独的文件来检查服务器上是否存在包含结果的JSON 文件,将其年龄与设置进行匹配,然后从缓存文件中返回数据,或者构建一个新的如果文件太旧,请缓存文件。

由于有数千种可能的搜索选项,我们只缓存单个搜索(在县、地区或类型上)。 JavaScript 总是调用我们的search_cache_builder.php 文件。如果有多个搜索参数,该文件只获取getvenues.php 返回的内容并提供它而不进行任何缓存。

除了一个特定的组合外,一切都很好。如果搜索venue_type=Castle / Fortvenue_name=Leeds Castlesearch_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 文件返回一个空数组?

【问题讨论】:

    标签: php json file-get-contents


    【解决方案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);
    

    【讨论】:

      【解决方案2】:

      因为$get_string === '?' 始终为假,请将其更改为==? 不是布尔值。

      我不建议使用 GET 参数 &amp;,? 作为文件名的一部分。
      除此之外,它会很快达到文件名的 5k(或 4k,不记得)限制。

      您可以通过 $GET、md5(或哈希)将数组排序为随机字符串。
      只要保证哈希机制一致,就可以轻松找回缓存文件。

      【讨论】:

      • 当然...只要记住search_cache_builder.php文件上没有JSON编码,所以空数组必须来自getvenues.php文件。 .
      • 不...我不知道您如何管理 getvenues.php 中的结果。鉴于您随附的唯一代码已经有问题,可能 getvenues.php 也有问题。为什么不先从简单的开始,回滚所有更改,然后var_dump($file_url);
      【解决方案3】:

      首先尝试urldecode 值,然后使用http_build_query 生成您的get_string,您的问题一定是值中的特殊字符(如/)。

      编辑: 如果你改变它的工作顺序:http://www.weddingvenues.com/search_cache_builder.php?venue_name=Leeds%20Castle&type=castle%20/%20fort

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-01
      • 2017-03-11
      • 1970-01-01
      相关资源
      最近更新 更多