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

PHP中使用num_rows方法时出现致命错误,请求技术协助

解决登录表单的致命错误问题

嘿,我一眼就揪出问题所在了——你在第14行调用num_rows的方式完全搞错啦!

错误原因分析

报错信息里的Call to undefined method mysqli::num_rows()已经说得很明白:num_rows不是数据库连接对象($conn)的方法,而是执行查询后返回的结果集对象($result)的属性。你现在让$conn去调用这个不存在的方法,可不就触发致命错误了嘛。

第一步:修复num_rows的调用逻辑

把你代码里的这一行:

if($conn->num_rows($result) == 1){

改成下面两种写法的任意一种就行:

写法1:面向对象风格(推荐)

if($result && $result->num_rows == 1){

这里加了$result &&的判断,是为了防止查询失败(比如SQL语法出错)时$result为false,导致后续访问num_rows继续报错。

写法2:过程化风格

if($result && mysqli_num_rows($result) == 1){

第二步:紧急修复SQL注入漏洞!

必须严肃提醒你:现在的代码有严重的SQL注入风险!直接把用户输入的$username和$password拼进SQL语句里,黑客能轻松篡改查询逻辑,甚至把你整个数据库的数据都偷走。

给你改成安全的预处理语句版本,这才是生产环境该用的写法:

<?php
require_once 'dbConnection.php';

if(isset($_POST['client-login-submit'])){
    $username = $_POST['username'];
    $password = $_POST['password'];

    // 使用预处理语句彻底避免SQL注入
    $sql = "SELECT * FROM users WHERE username = ? AND password1 = ? LIMIT 1";
    $stmt = $conn->prepare($sql);
    // 绑定参数:"ss"表示两个参数都是字符串类型
    $stmt->bind_param("ss", $username, $password);
    $stmt->execute();
    $result = $stmt->get_result();

    if($result && $result->num_rows == 1){
        header('location:welcome.php');
        exit; // 跳转后一定要加exit,防止脚本继续执行后续代码
    }else{
        header('location:error.php');
        exit;
    }
}else{
    header('location:notworking.php');
    exit;
}
?>

额外安全提示

还有个细节要注意:如果你的数据库里password1字段存的是明文密码,这也是极度不安全的!建议以后用password_hash()加密用户密码,验证时用password_verify()比对,绝对不要直接存储明文密码。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:23:03