PHP含函数的if语句失效求助:password_verify与num_rows判断异常
问题解决建议
一、password_verify 分支判断异常问题
你遇到的核心问题是运算符优先级导致的误解,并非if语句写法错误。看你else分支的代码:
echo 'Incorrect password!' . password_verify($_POST['password'], $password)? "ok": "ko";
PHP中字符串连接符.的优先级高于三元运算符?:,这段代码的实际执行逻辑是:
- 先执行
'Incorrect password!' . password_verify(...),将布尔值转为字符串(true→"1",false→""),得到非空拼接字符串。 - 再判断这个非空字符串是否为真(永远为true),所以必然输出"ok"——但这不代表password_verify返回了true。
你可以修改else分支代码验证真实结果:
// 用括号强制优先执行password_verify echo 'Incorrect password!' . (password_verify($_POST['password'], $password)? "ok": "ko");
或者单独输出验证结果:
$verifyResult = password_verify($_POST['password'], $password); var_dump($verifyResult); // 查看真实布尔值 echo 'Incorrect password!' . ($verifyResult ? "ok" : "ko");
如果确认password_verify确实返回true但if分支不执行,检查两个点:
- 确认
$password变量在if判断前未被意外修改(比如被trim、二次加密)。 - 确认
$_POST['password']的值与测试时一致(比如是否存在转义、编码问题)。
二、$stmt->num_rows 始终为false的问题
使用mysqli预处理语句时,必须先调用store_result()方法,才能正确获取num_rows的值。默认情况下,预处理语句不会把结果集加载到内存,直接访问num_rows会得到0。修改代码如下:
$stmt->execute(); $stmt->store_result(); // 关键步骤:先存储结果集 if ($stmt->num_rows > 0) { // 执行操作 } else { // 执行其他操作 }
另外,也可以通过fetch()方法直接判断是否有结果:
$stmt->execute(); if ($stmt->fetch()) { // 存在记录,执行操作 } else { // 无记录,执行其他操作 }
内容的提问来源于stack exchange,提问作者chicca
相关产品推荐
相关产品推荐

