MySQL转mysqli无报错但未写入数据库,请求技术排查
哇,7小时折腾这个确实够头疼的——页面明明显示“log added”,数据库却没数据,这种“虚假成功”的问题最磨人了!结合你描述的情况,大概率是几个容易忽略的mysqli低级错误,我帮你捋捋常见的排查点:
事务没提交:如果你在代码里手动开启了事务(比如
mysqli_begin_transaction($conn)),但最后忘了调用mysqli_commit($conn),那数据只会停留在内存的事务缓冲区里,根本不会写入数据库。哪怕你的提示逻辑走通了,实际数据也没落地。没检查SQL执行的真实结果:很多人写完
mysqli_query就直接跳去显示成功提示,完全没确认SQL到底跑没跑成。赶紧在执行代码后面加个错误检查:$result = mysqli_query($conn, $your_sql); if (!$result) { die("SQL执行失败: " . mysqli_error($conn)); }说不定你的SQL语法有问题(比如把
mysql_real_escape_string换成mysqli_real_escape_string时忘了传连接对象),但你没捕获错误,就直接走到成功提示了。连接对象没正确传递:如果你的函数分散在两个文件里,很可能执行SQL的函数没拿到正确的mysqli连接对象。比如文件1里创建了
$conn = mysqli_connect(...),但文件2的函数里没通过全局变量、参数传递或者类属性拿到这个$conn,那mysqli_query可能根本没连上目标数据库,自然不会有数据写入,但页面还是会按你的逻辑提示成功。自动提交被意外关闭:mysqli默认是自动提交的,但如果之前的代码里设置了
mysqli_autocommit($conn, false),又没手动提交事务,那数据就不会写入数据库。SQL变量拼接/绑定错误:如果你用字符串拼接生成SQL,可能变量没正确转义、漏加引号,或者变量值为空导致SQL执行后没有影响行数(比如给NOT NULL字段传了空值)。这种情况下SQL可能“成功执行”但没插入数据,你的提示逻辑就会误判。
快速排查小技巧
立刻把你的“log added”提示改成基于真实执行结果的判断:
if (mysqli_affected_rows($conn) > 0) { echo "log added"; } else { echo "插入失败: " . mysqli_error($conn); }
这样就能直接看到具体的错误信息,比瞎猜高效太多!
内容的提问来源于stack exchange,提问作者user3691363

