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

为何重复邮箱校验时出现‘Attempt to read property "num_rows" on bool’错误?

解决"Attempt to read property 'num_rows' on bool"错误

你这段代码出现错误的核心原因是**mysqli_query()执行查询失败,返回了布尔值false,而非预期的结果集对象**,直接对false调用mysqli_num_rows()就会触发这个错误。具体导致查询失败的原因有以下几点:

  • SQL语法错误:变量未加引号
    你的SQL语句中直接拼接$Email变量,如果$Email是字符串类型(比如test@example.com),生成的SQL会变成:

    SELECT * from customerlogin_tbl where Email=test@example.com
    

    这不符合SQL语法规则,字符串类型的字段值必须用单/双引号包裹,数据库无法识别该查询,导致mysqli_query()返回false。

  • 变量名拼写错误
    代码里的Query = "SELECT..."缺少美元符号$,正确的变量名应该是$Query,这属于PHP语法错误,会直接导致代码执行异常,$Result无法获取正确的结果集。

  • 未处理查询失败的场景
    即便修复了前面的问题,也可能因数据库连接异常、表名拼写错误等原因导致查询失败,此时mysqli_query()依然会返回false,你需要先判断查询是否成功,再调用mysqli_num_rows()。

修复后的基础版本代码

// 修正变量名,给字符串变量添加单引号
$Query = "SELECT * from customerlogin_tbl where Email='$Email'";
$Result = mysqli_query($con, $Query);

// 先判断查询是否成功,再处理结果
if ($Result && mysqli_num_rows($Result) > 0) {
    $error['txtEmail'] = 'Email already exists'; // 修正拼写错误:alrady → already
} 

更安全的写法(使用预处理语句防SQL注入)

直接拼接变量存在SQL注入风险,推荐使用预处理语句:

$stmt = mysqli_prepare($con, "SELECT * from customerlogin_tbl where Email=?");
mysqli_stmt_bind_param($stmt, "s", $Email);
mysqli_stmt_execute($stmt);
$Result = mysqli_stmt_get_result($stmt);

if (mysqli_num_rows($Result) > 0) {
    $error['txtEmail'] = 'Email already exists';
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 02:30:13