我有一个中央PHP脚本,用于处理来自页面的许多请求,使用JavaScript的XMLHttpRequest()调用以及GET方法。我的服务器PHP当前为5.6,是的,我正在避免同步调用。
一切正常,但是在某些情况下,我不希望该请求不保留在浏览器历史记录中,甚至不显示在URL中。因此,基于此调用中的MDN reference,我认为我可以简单地切换到POST方法,保留现有请求(例如“ http://myscript.php?cmd=dothis&data=somedata”)。然后我要做的就是将一些代码添加到我的PHP脚本中,这样我就可以以任何一种方式收集传递的数据...
if ($_SERVER['REQUEST_METHOD'] === 'GET') {
if(isset($_GET['cmd'])) $cmd = $_GET['cmd'];
if(isset($_GET['data'])) $data = $_GET['data'];
}
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
if(isset($_POST['cmd'])) $cmd = $_POST['cmd'];
if(isset($_POST['data'])) $data = $_POST['data'];
}
显然我错了。我发现的是...
不建议使用PHP:自动填充$ HTTP_RAW_POST_DATA为 已过时,将在以后的版本中删除。为了避免这种情况 警告在php.ini中将“ always_populate_raw_post_data”设置为“ -1”并使用 改为php:// input流。在第0行的“未知”中
很显然,这是一个死胡同。尽我所能研究这里发生的事情,在PHP manual reference to POST中,我首先读到了这篇文章……
$ _ POST $ HTTP_POST_VARS [不建议使用]
因此,如果我理解正确,我只能使用$ _REQUEST数组获取POST变量的原因是,我的请求仍然像我仍在使用GET一样进行格式化,(显然吗?) 。因此,“哄骗”它起作用只是将问题转移到未来。
偶然地,通过在服务器上调用phpinfo.php可以看到,尽管在日志中看到了错误,但“ always_populate_raw_post_data”确实已经设置为“ -1”。因此,我发现所有建议“仅”在PHP.INI文件中进行此设置的“解决方案”都无济于事。
即使它“隐藏”了错误,这样做对我也不重要。我的说法是否正确?即使使用POST方法时,即使我只是从$ _REQUEST数组中收集通过的PHP变量,并找出抑制LOG中“已弃用”警告的方法,整个方案仍然会崩溃(并使我的POST请求失败),那一天我终于迁移到PHP 7.x。?
我很抱歉在这里问,但是我确实尝试搜索我可以找到的每个引用,这些引用都使用POST方法执行XMLHttpRequest,以及我在日志中获得的已弃用的错误消息。那里有太多过时的信息,我找不到关于如何正确更改或重新格式化XMLHttpRequests的清晰讨论,以便可以使用POST方法。实际上,我什至无法肯定地确定在PHP.5.6之外是否可以这样做。任何帮助将不胜感激。
答案 0 :(得分:1)
PHP在将浏览器将HTML格式的数据放置在$_GET
属性设置为GET或POST的默认位置之后,错误地命名了$_POST
和method
。
$_GET
从查询字符串中获取数据,即使请求方法是POST。
请求正文由您传递给send
的参数确定。您放入查询字符串中的数据仍保留在查询字符串中。
const url = 'http://myscript.php'
const form_data = new FormData();
form_data.append("cmd", "dothis");
form_data.append("data", "somedata");
cost xhr = new XMLHttpRequest;
xhr.open("POST", url);
xhr.addEventListener('load', function () { console.log(this.response); });
xhr.send(form_data);