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

sqlsrv_query查询正常但插入失败,附代码及报错求排查

问题排查与解决

一、password_hash 输出异常的原因

你提到password_hash输出为Array$2y$10$r3G2...,但使用reset($password_hash)时提示参数是字符串,这说明输出语句存在数组与字符串拼接的错误:

  • 正常情况下password_hash()返回的是加密后的字符串,不会带有Array前缀。出现这种输出,大概率是你在输出时将某个数组变量与$password_hash拼接,比如误写了类似echo $some_array . $password_hash的代码,而数组被PHP自动转换为字符串Array。
  • 从reset()的报错可以确认,最终$password_hash是字符串类型,并非数组,因此这部分本身不会导致INSERT失败,但需要确认在INSERT执行时该变量未被意外修改。

二、sqlsrv_errors() 输出警告的原因

sqlsrv_errors()返回的是嵌套数组结构,每个错误项都是包含SQLSTATE、错误代码、错误消息的数组。你直接echo $error会触发“Array to string conversion”警告,正确的错误输出方式应为:

$errors = sqlsrv_errors();
if ($errors) {
    foreach ($errors as $error) {
        echo "SQLSTATE: " . $error['0'] . "<br>";
        echo "错误代码: " . $error['1'] . "<br>";
        echo "错误信息: " . $error['2'] . "<br>";
    }
}

通过这种方式可以获取INSERT失败的具体原因,这是排查问题的关键步骤。

三、INSERT INTO 执行失败的可能原因

结合现有信息,优先排查以下几点:

  • 字段长度不足:PASSWORD_BCRYPT生成的哈希字符串固定为60字符,如果数据表中s字段的长度小于60(例如varchar(50)),会导致插入失败或数据被截断。需确保s字段类型为varchar(60)或更长。
  • 参数类型不匹配:检查su和s字段的数据类型是否与传入的参数匹配,例如su字段若为整数类型,但你传入的是字符串,会导致插入失败(不过SELECT能正常运行,说明su大概率是字符串类型)。
  • 数据库权限问题:确认数据库连接账号拥有对k表的INSERT权限。
  • 事务未提交:如果config.php中开启了事务但未提交,会导致INSERT操作无法持久化到数据库。

四、代码优化建议

在INSERT语句执行后立即添加错误检查,快速定位问题:

$stmt2= sqlsrv_query($conn, $query2,$params2);
if($stmt2 === false) {
    $errors = sqlsrv_errors();
    foreach ($errors as $error) {
        echo "SQLSTATE: " . $error['0'] . "<br>";
        echo "错误代码: " . $error['1'] . "<br>";
        echo "错误信息: " . $error['2'] . "<br>";
    }
}

同时在INSERT前添加var_dump($password_hash);,确认变量类型为字符串,无异常修改。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 18:05:23