当我提交此表单时,我始终有相同的错误消息。即使我输入正确或错误的密码或不输入密码或我写错了数据库的名称。所有这些错误我都有相同的错误信息: 请输入用户名和密码。 那有什么问题呢。我确信数据基础上的字段。
<?
session_start();
$username = $_POST['username'];
$password = $_POST['password'];
if ($username && $password)
{
$connect = mysql_connect("localhsost","root","adminffpass") or die("Couldent connet to database ");
mysql_select_db("login") or die("No data base found ");
$query = mysql_query("SELECT * FROM users WHERE username='$username'");
$numrows = mysql_num_rows($query);
if ($numrows !=0)
{
while ($row= mysql_fetch_array($query))
{
$dbusername = $row['username'];
$dbpassword = $row['password'];
}
if ($username == $dbusername && $password==$dbpassword)
{
echo "Login successul .<a href='memeberarea.php'>Click to enter member area</a>";
$_SESSION['username'] = $dbusername;
}
else
echo "incorrect password ";
}
else
die ("That user name dosent exist");
}
else
die ("Please enter a username and password");
?>
答案 0 :(得分:3)
即使我输入正确或错误的密码或不输入密码或我写错了数据库的名称。所有这些错误我都有相同的错误信息
错字:localhsost
一件事。另外,您可能无法使用mysql_
函数,因为它们已被弃用,可能无法供您使用。
另外,您的POST阵列可能会失败,因此请确保您的表单是POST方法,并且您的元素具有name属性。
即:
<input type="text" name="username">
等
如果我写了错误的名称数据库,我没有任何错误。为什么?“
因为,您只是使用or die("Couldent connet to database ")
而不是真正的错误mysql_error()
mysql_connect()
=&gt; http://php.net/manual/en/function.mysql-connect.php
<?php
$link = mysql_connect('localhost', 'mysql_user', 'mysql_password');
if (!$link) {
die('Could not connect: ' . mysql_error());
}
echo 'Connected successfully';
mysql_close($link);
?>
您目前的代码向SQL injection开放。使用mysqli
with prepared statements或PDO with prepared statements。
我注意到您可能以纯文本格式存储密码。如果是这种情况,则非常气馁。
对于密码存储,请使用CRYPT_BLOWFISH或PHP 5.5的password_hash()
功能。对于PHP&lt; 5.5使用password_hash() compatibility pack
。
将error reporting添加到文件的顶部,这有助于查找错误。
<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);
// rest of your code
旁注:错误报告应仅在暂存时完成,而不是生产。
另外,您应该使用条件if ($username && $password)
代替!empty()
。
最好在整个代码中使用正确且一致的支撑。
else{
echo "incorrect password ";
}
等
存储密码哈希
将PDO用于预先准备的语句和password_hash()
:
只需使用图书馆。认真。它们存在是有原因的。
password_hash()
password-compat
(上面的兼容包不要自己动手。如果你正在创造自己的盐,你做错了。你应该使用一个为你处理这个问题的库。
$dbh = new PDO(...);
$username = $_POST["username"];
$email = $_POST["email"];
$password = $_POST["password"];
$hash = password_hash($password, PASSWORD_DEFAULT);
$stmt = $dbh->prepare("insert into users set username=?, email=?, password=?");
$stmt->execute([$username, $email, $hash]);
登录时:
$sql = "SELECT * FROM users WHERE username = ?";
$stmt = $dbh->prepare($sql);
$result = $stmt->execute([$_POST['username']]);
$users = $result->fetchAll();
if (isset($users[0]) {
if (password_verify($_POST['password'], $users[0]->password) {
// valid login
} else {
// invalid password
}
} else {
// invalid username
}
答案 1 :(得分:0)
您可以为自己打印一些信息,这样您就可以看到错误。更改以下行:
echo "incorrect password ";
这样的事情:
echo "incorrect password, u:[$username/$dbusername] p:[$password/$dbpassword]";
如果你会看到详细的信息,你就会知道,这是错误的。
编辑:当然,不要在最终代码中留下pwd打印:)