You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

升级PHP8.3与MariaDB11.3后插入数据触发mysqli_sql_exception报错求助

报错原因排查与解决建议

直接报错原因

happy列定义为整数类型,但你传入了空字符串'',新版本MariaDB 11.3默认开启的严格SQL模式会拒绝这种类型不匹配的插入操作,同时PHP 8.3对错误的抛出机制更严格,直接触发了致命错误。

从你提供的参数输出能看到,对应happy的位置是空值,最终拼接进SQL后变成了'',这完全不符合整数列的取值要求。

代码层面的问题

  1. 空值未做处理:$happy变量为空时,没有设置合法的默认值(比如0)或转换为NULL,直接拼入SQL导致类型错误。
  2. SQL拼接存在安全与兼容性问题:直接将变量硬编码进SQL语句,不仅会引发类型适配问题,还存在严重的SQL注入风险,新环境对这类不安全写法的兼容性更差。

解决步骤

  1. 修复变量赋值逻辑:

    • 先确认happy列是否允许NULL:如果允许,当$happy为空时将其设为NULL;如果不允许,设置默认整数值(比如0)。
    • 示例代码:$happy = empty($happy) ? 0 : (int)$happy;(根据列的非空要求调整)
  2. 改用预处理语句(推荐):
    预处理语句会自动处理数据类型转换,同时彻底避免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);
    
  3. 临时调整SQL模式(仅测试用):
    如果需要快速验证问题,可以先查看当前数据库的SQL模式:

    SELECT @@sql_mode;
    

    若结果包含STRICT_TRANS_TABLES或STRICT_ALL_TABLES,可以临时关闭该模式,但长期建议修复代码适配严格模式,避免后续出现更多兼容性问题。

内容的提问来源于stack exchange,提问作者iyagi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 17:16:06