我目前正在为新闻网站制作一个登录系统,作为我课程的一部分。出于某种原因,当我在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){