升级PHP8.3与MariaDB11.3后插入数据触发mysqli_sql_exception报错求助
报错原因排查与解决建议
直接报错原因
happy列定义为整数类型,但你传入了空字符串'',新版本MariaDB 11.3默认开启的严格SQL模式会拒绝这种类型不匹配的插入操作,同时PHP 8.3对错误的抛出机制更严格,直接触发了致命错误。
从你提供的参数输出能看到,对应happy的位置是空值,最终拼接进SQL后变成了'',这完全不符合整数列的取值要求。
代码层面的问题
- 空值未做处理:
$happy变量为空时,没有设置合法的默认值(比如0)或转换为NULL,直接拼入SQL导致类型错误。 - SQL拼接存在安全与兼容性问题:直接将变量硬编码进SQL语句,不仅会引发类型适配问题,还存在严重的SQL注入风险,新环境对这类不安全写法的兼容性更差。
解决步骤
修复变量赋值逻辑:
- 先确认
happy列是否允许NULL:如果允许,当$happy为空时将其设为NULL;如果不允许,设置默认整数值(比如0)。 - 示例代码:
$happy = empty($happy) ? 0 : (int)$happy;(根据列的非空要求调整)
- 先确认
改用预处理语句(推荐):
预处理语句会自动处理数据类型转换,同时彻底避免SQL注入问题,完美适配新环境的严格校验规则:$stmt = mysqli_prepare($connect, "INSERT INTO hani_diary (id, day, img, title, weath, mood1, mood2, happy, love, html, text) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"); // 绑定参数:类型字符串对应参数类型,i=整数,s=字符串,根据实际列类型调整 $happyValue = empty($happy) ? 0 : (int)$happy; $loveValue = empty($love) ? 0 : (int)$love; mysqli_stmt_bind_param($stmt, "issssssisss", $_SESSION['Iyagi_Id'], $today, $img, $title, $weath, $mood1, $mood2, $happyValue, $loveValue, $c['web_edit'], $text); mysqli_stmt_execute($stmt);临时调整SQL模式(仅测试用):
如果需要快速验证问题,可以先查看当前数据库的SQL模式:SELECT @@sql_mode;若结果包含
STRICT_TRANS_TABLES或STRICT_ALL_TABLES,可以临时关闭该模式,但长期建议修复代码适配严格模式,避免后续出现更多兼容性问题。
内容的提问来源于stack exchange,提问作者iyagi
相关产品推荐
相关产品推荐

