我希望我能正确地格式化代码。我很难把这句话说出来。我已经搜索过了,从这个声明看起来应该是有效的。但是,当我运行它时,不管密码是什么,如果用户名以kacey开头,那么它就会转到echo "Logged in as: " . kacey;
同样,如果我将输入放到kaceyfeewaf,它仍然会转到echo "Logged in as: " . $myuser;
无论我输入了什么密码,都会发生这种情况。该行应该对kacey有效。
$sql = "SELECT * FROM $dbTable WHERE username = $myuser AND password = $mypass";
$result = mysql_query($sql);
if($result['username'] = $myuser && $result['password'] = $mypass;)
{
echo "Logged in as: " . $myuser;
} else {
echo "Fail ";
}
最佳答案
这里有一些问题。
首先,查询中的变量是字符串,因此需要引用它们:
WHERE username = '$myuser' AND password = '$mypass'
将
or die(mysql_error())
设置为mysql_query()
会发出语法错误的信号。然后你分配而不是比较
if($result['username'] = $myuser && $result['password'] = $mypass;)
使用两个等于
==
但是,这不是检查这些行是否存在的方式。
在使用函数获取/迭代找到的结果时,需要使用
mysql_num_rows()
或使用while
循环。以下是mysqli使用
mysqli_num_rows()
的示例:$conn=mysqli_connect("hostname","username","password","db");
$check_select = mysqli_query($conn, "SELECT * FROM `users`
WHERE email = '$email' AND pw='$pass'");
$numrows=mysqli_num_rows($check_select);
if($numrows > 0){
// do something
}
现在,我们不知道这些变量被分配到了哪里,也不知道从表单中是否使用了具有匹配名称属性的post方法。
即。:
<form action="" method="post">
<input type="text" name="username">
...
</form>
$username = $_POST['username'];
另一件我们不知道的事情是你用来连接的mysql api。确保您确实使用了与用于查询的同一个,即
mysql_
。不同的api不混合,例如mysqli_
或pdo。从连接到查询使用同一个。将error reporting添加到文件顶部,这将有助于查找错误。
<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);
// rest of your code
附带说明:显示错误只应在登台时进行,而不应在生产时进行。
我注意到你可能用纯文本存储密码。如果真是这样的话,我们会非常失望。
我建议您使用CRYPT_BLOWFISH或php 5.5的
password_hash()
函数。对于phppassword_hash() compatibility pack
。以下是从ircmaxell的一个答案中得出的pdo解决方案:
https://stackoverflow.com/a/29778421/
就用图书馆吧。说真的。它们的存在是有原因的。
php 5.5+:使用
password_hash()
php 5.3.7+:使用
password-compat
(上面的兼容包)所有其他:使用phpass
别自己动手。如果你自己创造盐,那你就错了。你应该使用一个为你处理的库。
$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
}
关于php - PHP,SQL,用户数据库,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31905078/