Php 过滤输入(输入服务器和文档根);返回空值

Php 过滤输入(输入服务器和文档根);返回空值,php,xdebug,filter-input,Php,Xdebug,Filter Input,我的网站托管在共享主机上。我正在尝试设置一个新的开发环境(当我说new时,我的意思是它看起来不像我以前的任何开发环境,从一个记事本++到像WAMP/XAMPP这样的“简单”服务器解决方案……但我是一个C#/.NET开发人员,所以php更像是我在家随意使用的东西……) 到目前为止,我的新环境包括: Windows 10(因为这是我在家里使用的) PhpStorm PHP7.3.3VC15x64线程安全解压到我硬盘上的某个地方 php.exe在PhpStorm中被称为解释器 phpxdebug-2

我的网站托管在共享主机上。我正在尝试设置一个新的开发环境(当我说new时,我的意思是它看起来不像我以前的任何开发环境,从一个记事本++到像WAMP/XAMPP这样的“简单”服务器解决方案……但我是一个C#/.NET开发人员,所以php更像是我在家随意使用的东西……)

到目前为止,我的新环境包括:

  • Windows 10(因为这是我在家里使用的)
  • PhpStorm
  • PHP7.3.3VC15x64线程安全解压到我硬盘上的某个地方
  • php.exe在PhpStorm中被称为解释器
  • phpxdebug-2.7.0-7.3-vc15-x86_64.dll集已在php.ini中调试
在我的php代码中

filter_input(INPUT_SERVER,'DOCUMENT_ROOT');
它返回null(或空的内容)

当我将其粘贴到终端时,显示:

“filter_input”未被识别为内部或外部命令, 可操作的程序或批处理文件

嗯,也许这就是我所期望的终端类型,但它返回null的事实是一个问题

我应该更改什么,使其返回与在线环境中相同的值

我已经尝试了来自世界各地的解决方案 包括将
变量\u order=“GPCSE”
添加到php.ini,但这并没有解决问题

编写
filter\u var(getenv('DOCUMENT\u ROOT')相反,但它没有解决问题

我想为我的在线环境编写代码,而不是使我的代码适应我的开发环境


进一步测试1

运行代码

var_dump(realpath(dirname(__FILE__).'/../'));

if($_SERVER['DOCUMENT_ROOT'] === '')
    $_SERVER['DOCUMENT_ROOT'] = realpath(dirname(__FILE__).'/../');

var_dump($_SERVER['DOCUMENT_ROOT']);

var_dump(filter_input(INPUT_SERVER, 'DOCUMENT_ROOT'));
第一个var_转储显示正确的值。 第二个变量转储显示正确的值。 第三个变量转储显示字符串(0)”。
不过,我不太确定$服务器和INPUT服务器之间的关系。

这将查看您的服务器是否能够解析INPUT服务器和INPUT ENV中的正确信息。如果第一个var_dump没有显示“DOCUMENT_ROOT”变量,那么filter_输入函数也不会显示

<?php
var_dump($_SERVER);
foreach ( array_keys($_SERVER) as $b ) {
    var_dump($b, filter_input(INPUT_SERVER, $b));
}
echo '<hr>';
var_dump($_ENV);
foreach ( array_keys($_ENV) as $b ) {
    var_dump($b, filter_input(INPUT_ENV, $b));
}
?>

这将查看您的服务器是否能够从INPUT\u server和INPUT\u ENV解析正确的信息。如果第一个var_dump没有显示“DOCUMENT_ROOT”变量,那么filter_输入函数也不会显示

<?php
var_dump($_SERVER);
foreach ( array_keys($_SERVER) as $b ) {
    var_dump($b, filter_input(INPUT_SERVER, $b));
}
echo '<hr>';
var_dump($_ENV);
foreach ( array_keys($_ENV) as $b ) {
    var_dump($b, filter_input(INPUT_ENV, $b));
}
?>

我在这里找到了一些方法:

显然,当您单击debug按钮时,PhpStorm不会像通过服务器访问一样运行PHP脚本,因此一些值(如DOCUMENT_ROOT)不会被填充

但是,在访问文档时,文档_ROOT确实包含预期值

注意:使用localhost(或其他名称)可能需要编辑\Windows\System32\Drivers\Etc\hosts文件

我还在localhost:80上的PhpStorm(设置>语言和框架>PHP>服务器)中设置了一个“服务器”,但这个服务器似乎无效且不相关,您可能不需要它,不确定

编辑:我刚刚意识到这实际上只是一种局部的解决方法,因为如果我使用它,调试似乎无效,断点不会被触发。

这里是我发现的一些方法:

显然,当您单击debug按钮时,PhpStorm不会像通过服务器访问一样运行PHP脚本,因此一些值(如DOCUMENT_ROOT)不会被填充

但是,在访问文档时,文档_ROOT确实包含预期值

注意:使用localhost(或其他名称)可能需要编辑\Windows\System32\Drivers\Etc\hosts文件

我还在localhost:80上的PhpStorm(设置>语言和框架>PHP>服务器)中设置了一个“服务器”,但这个服务器似乎无效且不相关,您可能不需要它,不确定


编辑:我刚刚意识到这实际上只是部分解决方法,因为如果我使用它,调试似乎无效,断点不会触发。

在第一个循环的输出中,我看到一个名为“DOCUMENT\u ROOT”的键,但它的值为null。我可以修复此行为吗?第一个var\u dump($\u SERVER)命令的输出是什么?另外,代码是通过HTML页面还是从CLI运行的?如果从CLI运行,则文档\u根将为空,因为它由web服务器填充。var\u dump($\u server)是一个包含所有类型字符串值的数组,虽然文档\u根是空的,但很少有空的。我假设它们应该与filter\u input(input\u SERVER,…)中的DOCUMENT\u ROOT值相匹配,但它们似乎不太匹配,因为这里大多数都是空的。该页面是通过点击PhpStorm(shift+F9)的调试按钮加载的,作为一个.php文件。我不确定$_服务器和INPUT_服务器是否相关,但我只是在问题中添加了“进一步测试1”。当您通过Web服务器(Apache或IIS)访问php页面时,“DOCUMENT_ROOT”值是设置的。如果您是通过命令行界面访问,则文档根尚未设置,因此将为空。在第一个循环的输出中,我看到一个名为“DOCUMENT\u ROOT”的键,但它的值为null。我可以修复此行为吗?第一个var\u dump($\u SERVER)命令的输出是什么?另外,代码是通过HTML页面还是从CLI运行的?如果从CLI运行,则文档\u根将为空,因为它由web服务器填充。var\u dump($\u server)是一个包含所有类型字符串值的数组,虽然文档\u根是空的,但很少有空的。我假设它们应该与filter\u input(input\u SERVER,…)中的DOCUMENT\u ROOT值相匹配,但它们似乎不太匹配,因为这里大多数都是空的。该页面是通过点击PhpStorm(shift+F9)的调试按钮加载的,作为一个.php文件。我不确定$_服务器和INPUT_服务器是否相关,但我只是在问题中添加了“进一步测试1”。当您通过Web服务器(Apache或IIS)访问php页面时,“DOCUMENT_ROOT”值是设置的。如果您是通过命令行界面访问,则文档根尚未设置,因此将为空。它们的关联方式与$\u GET和INPUT\u GET的关联方式相同。