如何使用PHP内置服务器获取PHP中的查询字符串?

How to get the query string in PHP with the PHP built-in server?

我正在开发一个 MVC 网络应用程序,为了让它的路由器运行,我需要解析查询字符串,为此我需要首先将 URL 加载到一个变量中。如何使用 PHP 的内置服务器实现此目的?

我目前使用 PHP 7.3.9,但据我所知,这个问题在所有版本的内置服务器中都存在。

如果我使用Apache来运行这个应用程序,一切都很简单,我需要做的就是

$uri = $_SERVER['QUERY_STRING']; 我很高兴,一切正常。

但是,如果我使用 PHP 的内置网络服务器,我会收到一条错误消息:

Undefined index: QUERY_STRING in /path_to_my_project/public/index.php on line 22

我试着用谷歌搜索,发现 this pull request 表明 PHP 的内置网络服务器中确实不存在这样的变量。

所以我的问题是:如果 运行 内置服务器 $_SERVER['QUERY_STRING'] 不存在,我如何获取路由器的查询字符串?

您可以使用 REQUEST_URI 获得相同的结果,如果可用:

function getServerQueryString()
{
    if(isset($_SERVER['QUERY_STRING']))
    {
        return $_SERVER['QUERY_STRING'];
    }
    elseif(isset($_SERVER['REQUEST_URI']))
    {
        $xpl = explode('/', $_SERVER['REQUEST_URI']);

        $baseName = $xpl[array_key_last($xpl)];

        if(strpos($baseName, '?') !== false)
        {
             return substr($baseName, strpos($baseName, '?')+1);
        }
    }

    return null;
}

echo $uri = getServerQueryString();

一些示例:

pageName.php?par1=val1&par2=val2...
// Output:
par1=val1&par2=val2...

pageName.php?
// Output:
     // empty

/some/path
// Output:
     // empty

$_SERVER['QUERY_STRING'] 仅在请求中实际存在查询字符串时才会出现。您可以使用 array_key_exists():

避免此问题
if (array_key_exists('QUERY_STRING', $_SERVER)) {
    $uri = $_SERVER['QUERY_STRING'];
} else {
    $uri = '';
}

或 isset():

if (isset('QUERY_STRING', $_SERVER)) {
    $uri = $_SERVER['QUERY_STRING'];
} else {
    $uri = '';
}

或者(最简单的)通过空合并运算符:

$uri = $_SERVER['QUERY_STRING'] ?? '';

请注意,您可能也在 Apache 上遇到此错误,只是您没有注意到它,因为它通常不会转储到控制台。