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
相关产品推荐
相关产品推荐

