num row 未检测到 table 中的行

num row isnt detecting row in table

我目前正在为新闻网站制作一个登录系统,作为我课程的一部分。出于某种原因,当我在 if 语句中使用 $rows->num_rows == 1 时,它总是运行 "else" 代码。基本上这意味着它没有在我的 table 中检测到与输入的正确用户信息相对应的行... 这是 PHP 代码,当任何信息输入到 html 表单时,它就是 运行。

<?php
error_reporting(E_ALL);  
ini_set('display_errors', 1); 

//Connect to DB
    include_once("db_connect.php")or die ("Couldnt connect to DB");
$username = $_POST['user'];
$password = $_POST['password'];

session_start();

if(trim($username) != '' and trim($password) != ''){

//Sanitizes whatever is entered 
    $username=stripslashes($username);
    $password=stripslashes($password);

    $username=strip_tags($_POST['user']);
    $password=strip_tags($_POST['password']);

    $username=mysqli_real_escape_string($conn,$username);
    $password=mysqli_real_escape_string($conn,$password);

//Checks whether Username exists        
 $query = mysqli_query($conn, "SELECT * FROM user WHERE users='$username'  
 AND password = '$password' ")
 or die(mysqli_error($conn));

$numrows=mysqli_num_rows($query);

if($numrows > 0){

// echo "Record exists.";

$_SESSION['login_user']=$username; // Initializing Session

header("location: index.php"); // Redirecting To Other Page
exit;
}   

else {
    echo "Username or password is incorrect.";
}
}else{  
    echo "Please enter information";
}
?>

问题出现在最后一个 if 语句中,因为它从未检测到行。是的,我的 table 填充了 1 行用户信息(用户、密码),我的 HTML 表单也使用 POST.

我已经研究了这个问题至少 3 个小时,但仍然找不到解决方案。

以下是当前的错误日志:

Warning: include_once(1): failed to open stream: No such file or directory   in /home/vol9_7/byethost4.com/b4_18083024/htdocs/loginAuth.php on line 6

Warning: include_once(): Failed opening '1' for inclusion  
(include_path='.:/usr/share/pear/') in     
/home/vol9_7/byethost4.com/b4_18083024/htdocs/loginAuth.php on line 6

Notice: Undefined variable: conn in     
/home/vol9_7/byethost4.com/b4_18083024/htdocs/loginAuth.php on line 22

Warning: mysqli_real_escape_string() expects parameter 1 to be mysqli, null    
given in /home/vol9_7/byethost4.com/b4_18083024/htdocs/loginAuth.php on line   
22

Notice: Undefined variable: conn in  
/home/vol9_7/byethost4.com/b4_18083024/htdocs/loginAuth.php on line 23

Warning: mysqli_real_escape_string() expects parameter 1 to be mysqli, null   
given in /home/vol9_7/byethost4.com/b4_18083024/htdocs/loginAuth.php on line 
23

Notice: Undefined variable: conn in  
/home/vol9_7/byethost4.com/b4_18083024/htdocs/loginAuth.php on line 42

Warning: mysqli_query() expects parameter 1 to be mysqli, null given in     
/home/vol9_7/byethost4.com/b4_18083024/htdocs/loginAuth.php on line 42

Notice: Undefined variable: conn in 
/home/vol9_7/byethost4.com/b4_18083024/htdocs/loginAuth.php on line 43

Warning: mysqli_error() expects parameter 1 to be mysqli, null given in 
/home/vol9_7/byethost4.com/b4_18083024/htdocs/loginAuth.php on line 43

编辑:使用 Fred -ii- 答案。 include_once("db_connect.php")or die ("Couldnt connect to DB"); 现已移至代码顶部。

其次,添加了一个新的 if 语句来替换旧版本。这个说法也可以在Fred -ii- answer.

中找到

第三,SQL 语句已修复,因为我混淆了 table 和列 名字.

最后,error_reporting(E_ALL); ini_set('display_errors', 1); 已添加以帮助查找错误,再次由 Fred -ii- answer 提供。

下面的答案是 post 根据您原来的 post https://whosebug.com/revisions/37284594/1 编辑的,没有将其标记为编辑,而是将代码顶部的包含移动了两次,并且没有将它们标记为附加编辑。


你这是本末倒置

include_once("db_connect.php")or die ("Couldnt connect to DB");

它需要放在之前你调用任何需要数据库连接的函数,mysqli_real_escape_string()

您还应该使用 if ($rows->num_rows >= 1)if ($rows->num_rows > 0),如果以后随着您的数据库的增长,有不止一个人使用相同的用户名;这有可能发生。事实上,我昨天正在测试这种效果。

另外,在每个header之后使用exit;,否则你的代码可能要继续执行。

您还应该检查您的查询是否有错误;你没有那样做。

如果仍然不起作用,那么您针对 POST 数组使用的某些函数可能会产生不利影响,并且可能会删除有效字符。您可能需要删除它们。

使用准备好的语句将消除所有这些。

错误检查(您的查询失败)。

请参阅以下链接 http://php.net/manual/en/mysqli.error.php and http://php.net/manual/en/function.error-reporting.php 并将其应用到您的代码中。


密码

我还注意到您可能以明文形式存储密码。不推荐这样做。

使用以下之一:

关于列长度的重要旁注:

如果您决定使用 password_hash() 或兼容包(如果 PHP < 5.5)https://github.com/ircmaxell/password_compat/,请务必注意,如果您当前的密码列的长度低于 60,则需要更改为该值(或更高值)。手册建议长度为255。

您需要更改列的长度并使用新的散列重新开始,以便它生效。否则,MySQL 将默默地失败。

其他感兴趣的链接:


编辑:

更改此块:(您的方法可能因 $rows->num_rows 而失败)

$query="SELECT * FROM user WHERE users='$username' AND password = '$password'";
$rows = mysqli_query($conn, $query);

if ($rows->num_rows == 1){

    $_SESSION['login_user']=$username; // Initializing Session

    header("location: index.php"); // Redirecting To Other Page
}

至:

$query = mysqli_query($conn, "SELECT * FROM user WHERE users='$username' AND password = '$password' ")
or die(mysqli_error($conn))
;

$numrows=mysqli_num_rows($query);

if($numrows > 0){

// echo "Record exists.";

    $_SESSION['login_user']=$username; // Initializing Session

    header("location: index.php"); // Redirecting To Other Page
    exit;
}

并将其放在文件的顶部:

<?php 
error_reporting(E_ALL);  
ini_set('display_errors', 1); 

// rest of your code

备注:

虽然我在质疑这个 SELECT * FROM user WHERE users

确保你选择了正确的 table 并且你没有偶然地反转它们。

我建议你使用不同的代码

使用这个:

if ($result = mysqli_fetch_array($rows,MYSQLI_NUM)){

而不是这个:

if ($rows->num_rows == 1){