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

PHP含函数的if语句失效求助:password_verify与num_rows判断异常

问题解决建议

一、password_verify 分支判断异常问题

你遇到的核心问题是运算符优先级导致的误解,并非if语句写法错误。看你else分支的代码:

echo 'Incorrect password!'  . password_verify($_POST['password'], $password)? "ok": "ko";

PHP中字符串连接符.的优先级高于三元运算符?:,这段代码的实际执行逻辑是:

  1. 先执行 'Incorrect password!' . password_verify(...),将布尔值转为字符串(true→"1",false→""),得到非空拼接字符串。
  2. 再判断这个非空字符串是否为真(永远为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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 16:25:09