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
并将其应用到您的代码中。
密码
我还注意到您可能以明文形式存储密码。不推荐这样做。
使用以下之一:
- 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,则需要更改为该值(或更高值)。手册建议长度为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){
我目前正在为新闻网站制作一个登录系统,作为我课程的一部分。出于某种原因,当我在 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 并将其应用到您的代码中。
密码
我还注意到您可能以明文形式存储密码。不推荐这样做。
使用以下之一:
- 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,则需要更改为该值(或更高值)。手册建议长度为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){