WordPress自定义PHP脚本仅取消echo注释时可正常运行
问题根本原因
这个异常是逻辑错误叠加导致的,取消echo "Connected successfully";的注释脚本能正常运行纯粹是巧合:
- HTTP协议规定所有响应头必须在响应体内容之前发送,一旦输出了任何实际内容(包括echo的文本、空行、报错信息),PHP会自动把已设置的响应头发给客户端,之后无法再修改响应头。
- 你当前的代码在调用
header()发送重定向头后,没有立刻终止脚本运行,仅调用了ob_end_flush()。当你注释掉echo行时,输出缓冲区是空的,ob_end_flush()不会触发HTTP头的实际发送,后续WordPress的page.php模板会继续执行渲染逻辑,默认返回200状态的正常页面,覆盖掉你之前设置的302重定向头,浏览器收不到跳转指令,看起来就像脚本没运行。 - 当你取消echo的注释,输出的文本填充了缓冲区,调用
ob_end_flush()时会强制把重定向头和缓冲区内容一起发给客户端,后续WordPress逻辑已经无法修改已发送的响应头,浏览器收到重定向指令就会正常跳转,造成「脚本正常工作」的假象。 - 额外注意:你代码里的
$mysqli->mysqli_real_escape_string()是错误调用,mysqli面向对象写法对应的转义方法是$mysqli->real_escape_string(),这行本身会触发致命错误,必须一并修正,否则在不同错误显示配置下会出现额外异常。
修复方法
- 首先修正mysqli转义方法的错误调用,和你当前面向对象的代码风格保持一致:
$urlId = $mysqli->real_escape_string($_GET['uid']);
- 重定向逻辑不要依赖输出缓冲的巧合触发,发送重定向头后立刻调用
exit终止脚本执行,避免WordPress后续逻辑覆盖响应头。WordPress环境下优先用自带的wp_redirect()函数处理跳转,会自动符合HTTP规范、做基础安全校验。 - 修正后的核心跳转逻辑示例:
if (mysqli_num_rows($result) > 0) { $url = "https://thisismywebsite.com/?valid=1&uid=". $_GET['uid']; wp_redirect($url); exit; // 所有重定向后必须加退出,不能省略 } else { $url = "https://thisismywebsite.com/?valid=0&uid=". $_GET['uid']; wp_redirect($url); exit; }
如果不用WordPress自带函数,原生PHP写法要注意Location头的冒号后加空格,规范写法为header("Location: " . $url);,之后同样必须加exit。开头手动写的ob_start()在正确加了exit的情况下不是必须的,WordPress本身已经内置了输出缓冲机制。
内容的提问来源于stack exchange,提问作者NickGames
相关产品推荐
相关产品推荐

