我正在尝试制作一个简单的用户 - 登录系统。但是,我拥有会话的所有内容,并且工作正常,但用户登录不适用于数据库。我可以输入任何用户名和密码并登录。
这是我的登录页面:
<?php
session_start();
$db_host = "localhost"; // Place the database host here
$db_username = "data_user"; // Place the username for the MySQL database here
$db_pass = "password"; // Place the password for the MySQL database here
$db_name = "database_name"; // Place the name for the MySQL database here
if (isset($_POST['username']))
{
// MySQL Connection
$db_link = mysql_connect("$db_host","$db_username","$db_pass") or die ("could not connect to mysql. Make sure you have correctly inputed your host, username, and password.");
mysql_select_db("$db_name") or die ("no database could be found.");
$username = mysql_real_escape_string($_POST['username']);
$password = mysql_real_escape_string($_POST['password']);
// MySQL Query
$result = mysql_query("SELECT * FROM users WHERE
username = '$username' AND password = '$password' ");
if(!$result) {
$_SESSION['error'] = '<span style="color:red">Login Failed</span>';
} else
{
$row = mysql_fetch_assoc($result);
$_SESSION['userid'] = $row['id'];
$_SESSION['username'] = $username;
}
mysql_close($db_link);
}
header('Location: ./')
?>
我正在使用引导登录。所以这是我的登录 html:
<div id="login" class="modal hide fade" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
<h3 id="myModalLabel">Login</h3>
</div>
<div class="modal-body">
<form class="form-horizontal" action="login.php" method="post">
<div class="control-group">
<label class="control-label" for="inputUsername">Username</label>
<div class="controls">
<input name="username" type="text" id="inputUsername" placeholder="Username">
</div>
</div>
<div class="control-group">
<label class="control-label" for="inputPassword">Password</label>
<div class="controls">
<input name="password" type="password" id="inputPassword" placeholder="Password">
</div>
</div>
<div class="control-group">
<div class="controls">
<label class="checkbox">
<input type="checkbox"> Remember me
</label>
</div>
</div>
</div>
<div class="modal-footer">
<button type="submit" class="btn btn-primary">Sign in</button>
</form>
</div>
</div>
这是使用引导程序的非常基本的登录。我让日志工作正常,所以这很好,但是无论如何谁能向我解释为什么它没有连接到数据库,您可以使用您可以想象的任何用户名和密码登录?
if(!$result) {
是错误的检查。即使没有行,这也将返回有效。仅当查询执行失败时,才会生成 false。您应该检查行计数,可能使用 mysql_num_rows。
$num_rows = mysql_num_rows($result);
if($num_rows!=1)
{
echo "Bad U/P";
}
注意:是时候停止使用 mysql_* 函数并迁移到 mysqli 或 PDO 了
SQL 语句
SELECT * FROM users WHERE username = '$username' AND password = '$password'
将在行值下工作 $result
不会是假的。
这意味着在用户名/密码对无效的情况下,结果集没有行。
使用 PDO: 快速教程 »
$sth = $dbh->prepare( "SELECT `password` FROM `table` WHERE `username` = ?" );
$sth->execute( array( $username ) );
$returned_password = $sth->fetchColumn;
。通过这样的查询,意味着您不需要WHERE password
,意味着您不需要索引password
列(效率而言)。
--
从结果中,与用户输入的密码进行比较:
if ( $returned_password == $password )
// OK
else
// NOT OK
。或者,如果您以前将密码存储在某个哈希值中,这是一个很好的做法:
if ( $returned_password == md5( $password ) )
// OK
else
// NOT OK
。至于为什么你当前的脚本允许任何登录,请参阅@Hanky Panky ㇱ的答案。
祝你好运!
听起来可能很傻,
但是您实际上是否创建了名称为"database_name"和用户"data_user"的数据库?
$db_host = "localhost";
$db_username = "data_user";
$db_pass = "password";
$db_name = "database_name";
我相信您没有为数据库提供正确的详细信息。如果没有,请这样做,并告诉我们。
print_r($row);
打印$row行时显示的内容返回数据
尝试编辑以下行
$row = mysql_fetch_assoc($result);
$_SESSION['userid'] = $row['id'];
$_SESSION['username'] = $username;
}
自
$row = mysql_fetch_assoc($result);
$_SESSION['userid'] = $row[0]['id'];
$_SESSION['username'] = $username;
}
仅仅因为您使用了mysql_fetch_assoc结果数组将是行和列的关联数组。