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
相关产品推荐
相关产品推荐

