可在MySQL正常运行的SQL语句在PHP脚本中执行时报HTTP 500错误求助
问题根源
HTTP 500错误由PHP语法解析致命错误触发,核心原因是字符串边界冲突:
PHP代码中使用双引号"包裹整个SQL赋值语句,而SQL内部判断Gender字段的"Male"、"Female"等值同样使用双引号,PHP会将SQL内部第一个双引号识别为整个$sel_query字符串的结束标记,后续字符不符合PHP语法规范,直接触发致命错误返回500。
修复方案
方案1:转义SQL内部的双引号
在SQL内部所有双引号前加反斜杠\转义,避免被PHP识别为字符串结束符:
$sel_query="SELECT Class_List.Class_List_id, Class_List.class_id, count(Class_List.user_id) AS Total, User_Accounts_.user_id, User_Accounts_.firstname, User_Accounts_.lastname, User_Accounts_.ALN, User_Accounts_.EAL, count(if(User_Accounts_.Gender=\"Male\",1,NULL)) 'Male', count(if(User_Accounts_.Gender=\"Female\",1,NULL)) 'Female', count(if(User_Accounts_.Gender=\"ALN\",1,NULL)) 'ALN', count(if(User_Accounts_.Gender=\"EAL\",1,NULL)) 'EAL' FROM Class_List, User_Accounts_ WHERE User_Accounts_.user_id=Class_List.user_id AND Class_List.class_id=1";
方案2:SQL内部的字符串改用单引号包裹
MySQL原生支持单引号包裹字符串值,修改后不会和PHP外层的双引号冲突,可读性更好:
$sel_query="SELECT Class_List.Class_List_id, Class_List.class_id, count(Class_List.user_id) AS Total, User_Accounts_.user_id, User_Accounts_.firstname, User_Accounts_.lastname, User_Accounts_.ALN, User_Accounts_.EAL, count(if(User_Accounts_.Gender='Male',1,NULL)) 'Male', count(if(User_Accounts_.Gender='Female',1,NULL)) 'Female', count(if(User_Accounts_.Gender='ALN',1,NULL)) 'ALN', count(if(User_Accounts_.Gender='EAL',1,NULL)) 'EAL' FROM Class_List, User_Accounts_ WHERE User_Accounts_.user_id=Class_List.user_id AND Class_List.class_id=1";
方案3:外层改用单引号包裹SQL整体
PHP中单引号包裹的字符串不会解析内部特殊字符,也不会和SQL内部的双引号冲突:
$sel_query='SELECT Class_List.Class_List_id, Class_List.class_id, count(Class_List.user_id) AS Total, User_Accounts_.user_id, User_Accounts_.firstname, User_Accounts_.lastname, User_Accounts_.ALN, User_Accounts_.EAL, count(if(User_Accounts_.Gender="Male",1,NULL)) "Male", count(if(User_Accounts_.Gender="Female",1,NULL)) "Female", count(if(User_Accounts_.Gender="ALN",1,NULL)) "ALN", count(if(User_Accounts_.Gender="EAL",1,NULL)) "EAL" FROM Class_List, User_Accounts_ WHERE User_Accounts_.user_id=Class_List.user_id AND Class_List.class_id=1';
快速排查技巧
后续遇到PHP返回500错误时,可临时在脚本顶部添加以下代码打开错误显示,直接查看具体错误信息,无需盲测:
error_reporting(E_ALL); ini_set('display_errors', 1);
内容的提问来源于stack exchange,提问作者PythonHelp
相关产品推荐
相关产品推荐

