我正在尝试通过检查用户名和密码是否正确来从表用户中获取特定行的一些数据。 我不明白为什么它不起作用!
编辑:我插入整个页面的代码。我使用表单是因为我以相同的形式拥有注册按钮和登录按钮。我正在检查用户按下哪一个,然后执行操作。
$host = "xx";
$user = "xx";
$pass= "xx";
$dbname = "xx";
$conn = new mysqli($host,$user,$pass, $dbname );
if ($conn->connect_error) {
die("Connection failed : ".$conn->connect_error); //fixme
}
if ( isset($_POST['login']) ) {
if ($_POST["actionb"] == 'Login') {
$username = isset($_POST["username"]) ? $conn->real_escape_string($_POST["username"]) : "";
$password = isset($_POST["password"]) ? $conn->real_escape_string($_POST["password"]) : "";
echo $username;
echo $password;
$query = "SELECT * FROM users WHERE username='$username' AND password='$password'";
$results=$conn->query($query);
if (mysqli_num_rows($results) > 0 ) {
$_SESSION['username'] = $username;
if ($results->num_rows > 0) {
// output data of each row
while ($row = $results->fetch_assoc()) {
$email = $row["email"];
$postalcode = $row["postalcode"];
$phonenumber = $row["phonenumber"];
}
}
$_SESSION['postalcode'] = $postalcode;
$_SESSION['phonenumber'] = $phonenumber;
$_SESSION['email'] = $email;
echo "You are now logged in";
header('location: confirm.php');
} else {
//echo "Wrong username/password combination";
}
}
}
?>
<html>
<style type ="text/css">
...
</style>
<body>
<form action="" method="post">
<div class="header">
<h1>For existing users</h1>
</div>
<input type="hidden" name="actionb" value="Login" >
<label for="username"><b>Username</b></label>
<input type="text" placeholder="Enter username" name="username" required>
<label for="password"><b>Repeat Password</b></label>
<input type="password" placeholder="Repeat Password" name="password2" required>
<div class="clearfix">
<button type="submit" name="login" value="Login">Login</button>
</div>
</form>
</body>
</html>
答案 0 :(得分:1)
首先:就像@IdontDownVote所说的那样,在将密码存储在数据库中之前,应该始终对密码进行哈希加密(请参阅php.net/manual/en/book.password.php)。一个hack,您的所有用户都会讨厌您不这样做。 ;)
第二个:难道你会得到更多的收益吗? (如稍后在代码中if ($results->num_rows > 0) {
所假定的。)然后也会触发该错误,因为您检查了==1
,可能会将其更改为>0
。
第三:使用mysqli_query()
将if
调用添加到您的$results && mysqli_num_rows(..etc..
语句中,以检查$_POST['password2']
调用是否成功
第四:密码实际上以header()
的身份发送
第五:(如@FunkFortyNiner正确指出的那样)使用echo
作为重定向必须是输出到浏览器的第一件事(因此之前没有exit();
),然后是{ {1}},以防止在此之后发生其他echo
(在PHP中也无效)。
第六:(也正如@FunkFortyNiner指出的那样)在开发时,请始终使用error_reporting(E_ALL | E_STRICT | E_NOTICE);
和
ini_set('display_errors', 1);
在您的PHP顶部。这样,所有错误,警告等都会在浏览器中显式打印出来,以便您可以调试/清理/修复。