MySQL执行UPDATE后encrypted_password字段未更新问题求助
问题分析与解决步骤
你遇到的情况是PHP脚本返回{"success":true}但数据库encrypted_password字段未更新,这是因为PDO的execute()返回true仅表示SQL语句执行语法正确,不代表有实际行被更新。以下是具体排查和解决方法:
1. 检查实际更新的行数
在execute()后添加代码,查看受影响的行数:
$resultado = $sentencia->execute([$encrypted_password, $email]); $filas_actualizadas = $sentencia->rowCount(); // 输出行数用于调试 var_dump($filas_actualizadas);
如果输出int(0),说明WHERE email = ?条件没有匹配到任何记录。
2. 验证WHERE条件的正确性
- 调试
$email的实际值:输出var_dump($email),检查是否包含空格、大小写差异(比如数据库中是admin@test.com,但传入的是Admin@Test.com,且字段排序规则为区分大小写的utf8_bin)。 - 直接在数据库客户端执行SQL语句测试:
UPDATE tb_administradores SET encrypted_password = '测试哈希' WHERE email = '你传入的邮箱值';
看是否能成功更新,以此排除代码逻辑外的问题。
3. 核对数据库字段名
确认tb_administradores表的字段名是否确实为encrypted_password(对照你的表字段截图),避免字段名拼写错误(比如实际字段是password或enc_password)。
4. 开启PDO错误捕获
在conectar_pdo.php中添加PDO错误模式配置,捕获潜在的SQL执行异常:
$base_de_datos->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
之后如果存在权限不足、字段长度不够等问题,会直接抛出异常,便于定位错误。
5. 检查字段长度限制
password_hash()生成的哈希值默认长度约60字符,确保encrypted_password字段的类型为VARCHAR(255)(或足够容纳的长度),避免因长度不足导致更新失败或数据截断。
6. 排查事务问题
如果conectar_pdo.php中开启了事务(比如调用了$base_de_datos->beginTransaction()),需要在execute()后执行$base_de_datos->commit();,否则更新操作不会持久化到数据库。
内容的提问来源于stack exchange,提问作者mvasco
相关产品推荐
相关产品推荐

