为何重复邮箱校验时出现‘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
相关产品推荐
相关产品推荐

