num行未检测到表中的行



我目前正在为新闻网站制作一个登录系统,作为我课程的一部分。出于某种原因,当我在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语句,因为它从未检测到行。是的,我的表中填充了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

编辑:使用弗雷德-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-answer提供

以下答案是根据您的原始帖子发布的https://stackoverflow.com/revisions/37284594/1并且没有将其标记为编辑,并将代码顶部的include移动了两次,也没有将它们标记为附加编辑。


你在这里是本末倒置

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://www.php.net/manual/en/mysqli.quickstart.prepared-statements.php

错误检查(查询失败)。

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


密码

我还注意到,您可能将密码存储为纯文本。不建议这样做。

使用以下选项之一:

  • PHP 5.5的password_hash()函数
  • 兼容性包(如果PHP<5.5)https://github.com/ircmaxell/password_compat/

关于列长度的重要旁注:

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

您需要更改列的长度,然后使用新的哈希重新开始,以便它生效。否则,MySQL将静默失败。

其他感兴趣的链接:

  • CRYPT_BLOWFISH
  • crypt()
  • bcrypt()
  • scrypt()
  • 在OPENWALL上
  • PBKDF2
  • PHP.net上的PBKDF2
  • PBKDF2用于PHP

编辑:

更改此块:(您的方法可能对$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 对此提出质疑

确保你选择了正确的表格,并且你没有偶然地颠倒这些表格。

我建议您使用不同的代码

使用这个:

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

而不是这个:

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

相关内容

  • 没有找到相关文章

最新更新