我的问题是,当我尝试登录时,我的脚本会直接跳到循环的 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/