线上环境MySQLi插入语句无报错但不生效,本地正常求助
搞定线上MySQLi插入无响应的问题
嘿,这种本地跑的好好的,一到线上就悄咪咪插不进数据还没报错的情况,我遇过好多次了,咱们一步步揪出问题所在:
1. 先把隐藏的错误揪出来
线上服务器大多会默认关掉PHP错误显示,你先在代码开头加几行,强制让错误现形:
error_reporting(E_ALL); ini_set('display_errors', 1); mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
最后一行是让MySQLi不再静默失败,直接抛出异常,哪怕是不起眼的语法错误也会立刻显示出来。
2. 先把你的SQL语句补全!
从你贴的代码看,$insquery的INSERT语句明显没写完啊——最后停在tan_no,就断了!这绝对会导致SQL语法错误,本地你可能用的是完整代码,线上版本大概率没传全?赶紧把INSERT的字段补完,加上对应的VALUES部分,记得闭合引号,比如:
// 举个补全后的示例 $insquery = "INSERT INTO client_application(emp_id,org_name,...,tan_no,acc_name) VALUES('$emp_id','$org_name',...,'$tan_no','$acc_name')";
3. 文件上传的坑要排查
你的代码里处理了好几个文件上传,线上环境很容易在这里出问题:
- 上传目录权限:
uploads/client/目录有没有给web服务器写权限?比如Linux下要确保www-data用户能读写这个目录,执行chmod 755 uploads/client/或者chown www-data:www-data uploads/client/试试。 - 上传大小限制:PHP的
upload_max_filesize和post_max_size配置太小,导致文件上传失败,直接中断了后续的SQL执行?可以在php.ini里调整,或者临时在代码里加:
ini_set('upload_max_filesize', '10M'); ini_set('post_max_size', '10M');
- 图片检查逻辑有问题:你用
getimagesize()检查文件,但如果用户上传的是PDF、Word这类非图片文件,这个函数会返回false,直接搞崩后续逻辑!先判断文件是否存在再检查:
if (!empty($_FILES["legalfile"]["tmp_name"]) && file_exists($_FILES["legalfile"]["tmp_name"])) { $check = getimagesize($_FILES["legalfile"]["tmp_name"]); // 再做后续判断 }
4. 数据库权限和连接问题
- 线上的数据库账号有没有INSERT权限?本地账号权限够,但线上可能只给了SELECT权限?登录数据库执行
SHOW GRANTS FOR '你的账号'@'你的服务器IP';就能看到权限情况。 - 字符集不匹配:本地和线上数据库的字符集(比如utf8mb4)不一致,可能导致插入时静默失败?检查你的表字符集,还要确保PHP连接时设置了正确的字符集:
mysqli_set_charset($con, 'utf8mb4');
5. 表单提交数据有没有丢
线上环境的PHP配置可能有差异,比如register_globals状态不同,或者表单字段名和代码里的$_POST键名不匹配?比如表单里的提交按钮是不是真的叫name="submit"?在代码开头加var_dump($_POST);看看提交的数据是不是都收到了。
6. 手动检查SQL执行结果
不管有没有报错,都要手动输出SQL执行的结果,哪怕线上不显示,也可以写入日志:
// 执行插入后立刻检查 if(mysqli_query($con, $insquery)) { echo "插入成功"; } else { // 直接打印错误,或者写入日志 echo "SQL错误: " . mysqli_error($con); error_log("插入失败SQL: " . $insquery . " 错误信息: " . mysqli_error($con)); }
先把截断的SQL语句补全,这是最显眼的问题,然后按上面的步骤挨个排查,肯定能找到原因!
内容的提问来源于stack exchange,提问作者Kalai Shruthi
相关产品推荐
相关产品推荐

