num row isnt检测表中的行

时间:2016-05-17 19:19:56

标签: php mysqli mysql-num-rows

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

<?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语句,因为它从不检测行。是的,我的表填充了一行用户信息(用户,密码),我的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语句已经修复,因为我混合了表和列 名称

最后,error_reporting(E_ALL); ini_set('display_errors', 1); 已被添加以帮助发现错误,再次由Fred -ii-回答。

2 个答案:

答案 0 :(得分:2)

以下答案是根据您的原始帖子https://stackoverflow.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);这有可能发生。事实上,我昨天正在测试这个效果。

另外,在每个标题后使用exit;,否则您的代码可能希望继续执行。

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

如果仍然无效,那么您对POST阵列使用的某些功能可能会产生负面影响,并且可能会消除有效字符。您可能需要将其删除。

使用准备好的声明将远离所有这些。

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

请参阅以下链接http://php.net/manual/en/mysqli.error.phphttp://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

<强> NOTA:

我正在质疑SELECT * FROM user WHERE users

确保您选择了正确的表,并且没有偶然反转这些表。

答案 1 :(得分:0)

我建议您使用不同的代码

使用它:

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

而不是:

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