MacOS Mojave下PHP接收HTML表单为空的问题排查求助
嘿,我之前在MacOS Mojave搭本地PHP环境时也踩过类似的坑,给你一步步排查的思路:
首先,先纠正你代码里的小问题——第一个PHP脚本里,当检测到$_POST['name']存在时,只做了赋值$name = $_POST['name'],但没有输出任何内容!所以你提交表单后看不到返回结果,很容易误以为没收到数据。第二个脚本直接取$_POST["name"],如果请求不是POST(比如直接访问source.php),就会触发Undefined index错误,这也会干扰判断。
先把source.php改成下面的测试代码,能帮你更清晰地看到请求状态:
<?php // 先打印请求方法,确认是不是POST echo "请求方法:" . $_SERVER['REQUEST_METHOD'] . "<br>"; // 打印整个POST数组,看有没有数据 var_dump($_POST); ?>
提交表单后看输出,分情况处理:
情况1:请求方法是GET,$_POST为空
这说明表单根本没以POST方式提交,大概率是文件路径或访问方式错了:
- 不管是MAMP还是自建Apache,都要把HTML和PHP文件放在环境指定的文档根目录里:
- MAMP默认是
/Applications/MAMP/htdocs,访问要用http://localhost:8888/你的文件名.html(注意端口是8888) - 自建Apache默认是
/Library/WebServer/Documents,访问用http://localhost/你的文件名.html
- MAMP默认是
- 绝对不能直接双击打开HTML文件(以
file:///开头的地址),这种方式下表单提交不会经过PHP解析器,自然收不到数据。
情况2:请求方法是POST,但$_POST为空
这时候才是环境配置的问题,试试这几个排查点:
检查PHP的POST配置:
找到你的php.ini文件(MAMP在/Applications/MAMP/bin/php/对应PHP版本/conf/php.ini,自建Apache的话可能在/etc/php.ini),确认以下配置:post_max_size = 8M ; 至少要大于0,默认8M足够 enable_post_data_reading = On ; 这个必须是On,否则PHP不会读取POST数据修改后重启Apache或MAMP服务。
检查Apache的重写规则:
如果你的项目目录里有.htaccess文件,暂时把它重命名(比如改成.htaccess.bak),测试表单提交是否正常。有些重写规则可能会把POST请求转成GET,或者修改请求路径导致数据丢失。排除安全软件干扰:
暂时关闭Mac的防火墙(系统偏好设置 → 安全性与隐私 → 防火墙),或者第三方安全软件,测试是否能收到POST数据。虽然概率低,但偶尔会有本地请求被拦截的情况。检查自带PHP的兼容性:
MacOS Mojave自带的PHP版本是7.1,虽然理论上不影响POST提交,但如果是自建环境,确保Apache已经正确加载PHP模块:打开httpd.conf,确认有类似下面的行:LoadModule php7_module libexec/apache2/libphp7.so AddHandler php7-script .php没有的话要加上,然后重启Apache。
如果按上面的步骤排查,应该能找到问题所在。我当时是因为误把文件放在了文档根目录外,用file协议访问导致的,改回http访问就正常了。
内容的提问来源于stack exchange,提问作者NT_code

