php - 登录系统无法登录

标签 php mysql login

我的问题是,当我尝试登录时,我的脚本会直接跳到循环的 else 部分。
我试图放入 printf 语句进行调试,并发现我的密码散列与数据库中的值相结合。

<?php
//include_once './bin/configDb.php';
//MySQL connection variables
$dbhost = 'localhost';
$dbname = 'ideabank';
$dbuser = 'xxx';
$dbpass = 'xxx';
$table = 'members';
// Connect to server and select databse.
//include_once './bin/connectDb.php';
$conn = mysql_connect($dbhost, $dbuser, $dbpass);
mysql_select_db($dbname, $conn);
// username and password sent from form, cleanout, esacpe string against sqlinj.
$username = mysql_real_escape_string($_POST['username']);
$password = hash('sha512', $_POST['password']);
printf("$username \n");
printf("$password \n");
$sql = "SELECT * FROM $table WHERE username = '$username' AND password = '$password'
";
$result=mysql_query($sql);
//$result = mysql_query("SELECT * FROM $table WHERE username = '$username' AND password = '$password'
//");
// Replace counting function based on database you are using.
$count=mysql_num_rows($result);
// If result matched $username and $password, table row must be 1 row
if($count==1){
// Register $username, $password and redirect to file "login_success.php"
session_register("username");
session_register("password");
header("location:login_success.php");
}
else {
echo "Wrong Username or Password";
}
exit ()
?>

我的 MYSQL 数据库看起来像这样,
CREATE TABLE IF NOT EXISTS `members` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(30) NOT NULL,
`password` varchar(256) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `username` (`username`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=7 ;

然后我添加了这个以获取更多错误消息
var_dump($count);

还尝试了我的查询字符串
$sql = "SELECT * FROM $table WHERE username = '$username'";

这给了我这个值(value)

$sqlint(0)

所以我的查询没有返回任何内容。

所以我通过将 $table 变量删除为确切的表名“members”来更改 sql 查询

它给了我一个新的错误:
$sql Warning: mysql_num_rows() expects parameter 1 to be resource, boolean given in      
/var/www/ideabank/checklogin.php on line 35 Call Stack: 0.0002 657184 1. {main}() /var/www/ideabank/checklogin.php:0 0.0006 660584 2. mysql_num_rows() /var/www/ideabank   /checklogin.php:35 NULL

第 35 行是我的 if($count==1)

所以我测试了一个针对数据库的简单查询
    SELECT * From members

结果是,显示第 0 - 5 行(共 6 行,查询耗时 0.0004 秒)

好的,所以我再次更改了查询
$sql = "SELECT * FROM members WHERE password = '$password'";

结果:

$sqlint(2)

这是正确的,因为我有两个使用相同密码的帐户。

所以我又做了一个查询
$sql = "SELECT * FROM members WHERE username = '$username'";

这是有道理的,因为用户名是唯一的

结果:

$sql 警告:mysql_num_rows() 期望参数 1 是资源, bool 值在/var/www/ideabank/checklogin.php 第 35 行调用堆栈:0.0002 653256 1. {main}()/var/www/ideabank/checklogin .php:0 0.0007 656528 2.mysql_num_rows()/var/www/ideabank/checklogin.php:35 NULL

由于警告表示第 35 行有错误,因此返回 NULL!

创建警告的行是我的计数器,用于确保我只显示一条记录。

我最初的想法是,

如果结果匹配 $username & $password 那么行必须是 == 到 1

但它会抛出相同的 sql 错误

现在我尝试更改计数器并改用 mysql_num_rows
if (
mysql_num_rows($result))
{
session_start();
...
eller
if (
mysql_num_rows($result) == 1)
{
session_start();
...

但它仍然会引发 sql 警告。

最佳答案

首先检查 mysql_query() 的返回值

if( mysql_query($query) ) {
     // retrieve result
}
else {
    die( mysql_error() );
}

阅读 SQL 注入(inject)漏洞以及如何在 PHP 中防止它们。您的代码是等待发生的安全噩梦。通过 mysql_real_escape_string() 运行用户名和密码开始.或者更好的是使用 PDO这给了你占位符。

不要使用 session_register()

关于php - 登录系统无法登录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6862851/

相关文章:

java - 如何在 Java 中将 MySQL 表中的行存储到数组中

Django - 重定向到登录页面与 403

reactjs - 使用 react 组件在 react 应用程序上使用 Google 进行 SSO react-google-login

facebook - 使用FB.login()在IE8上出现奇怪的错误

php - 如何在没有 foreach 循环的情况下在 codeigniter 中使用 $query->result() 从数据库中获取数据?

php在while循环中用变量求和时间

php - 在 Ubuntu 10.04 上使用最新的 OpenSSL Opdate Curl

php - 选择包含变量且 ID 相同的数据组

mysql - 除了多个 OR 之外还需要 WHERE AND 子句

MySQL嵌套查询问题