从php数据库检查密码

从php数据库检查密码,php,html,mysql,database,session,Php,Html,Mysql,Database,Session,我试图通过检查用户名和密码是否正确,从表users中获取特定行的一些数据。 我不明白为什么它不起作用 编辑:我插入整个页面的代码。我使用表单,因为我在同一表单中有注册按钮和登录按钮。我正在检查用户按下哪一个按钮,然后执行操作。 $host = "xx"; $user = "xx"; $pass= "xx"; $dbname = "xx"; $conn = new mysqli($host,$user,$pass, $dbname ); if ($conn->connect_error)

我试图通过检查用户名和密码是否正确,从表users中获取特定行的一些数据。 我不明白为什么它不起作用

编辑:我插入整个页面的代码。我使用表单,因为我在同一表单中有注册按钮和登录按钮。我正在检查用户按下哪一个按钮,然后执行操作。
$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>
$host=“xx”;
$user=“xx”;
$pass=“xx”;
$dbname=“xx”;
$conn=newmysqli($host、$user、$pass、$dbname);
如果($conn->connect\u错误){
die(“连接失败:”.$conn->connect_error);//修复
}
如果(isset($_POST['login'])){
如果($_POST[“actionb”]=“登录”){
$username=isset($\u POST[“username”])?$conn->real\u escape\u字符串($\u POST[“username”]):“”;
$password=isset($\u POST[“password”])?$conn->real\u escape\u字符串($\u POST[“password”]):“”;
echo$username;
echo$密码;
$query=“从用户名为“$username”和密码为“$password”的用户中选择*;
$results=$conn->query($query);
如果(mysqli_num_行($results)>0){
$\会话['username']=$username;
如果($results->num_rows>0){
//每行的输出数据
而($row=$results->fetch_assoc()){
$email=$row[“email”];
$postalcode=$row[“postalcode”];
$phonenumber=$row[“phonenumber”];
}
}
$\会话['postalcode']=$postalcode;
$\会话['phonenumber']=$phonenumber;
$\会话['email']=$email;
回显“您现在已登录”;
标题('location:confirm.php');
}否则{
//回显“错误的用户名/密码组合”;
}
}
}
?>
...
对于现有用户
用户名
重复密码
登录

首先:就像@IdontDownVote所说的,在将密码存储到数据库之前,您应该始终(!)对密码进行哈希/加密(请参见php.net/manual/en/book.password.php)。一次黑客攻击,你的所有用户都会因为你不这么做而恨你

第二:你能不能多退一排?(正如您的
if($results->num_rows>0){
在代码的后面所假定的那样。)由于您检查
==1
,因此也会触发错误,可能会将其更改为
>0

第三:用
$results&&mysqli\u num\u行(…等)将调用添加到
if
语句中,检查
mysqli\u query()
调用是否成功

第四:密码实际上是作为
$\u POST['password2']

第五:(正如@FunkFortyNiner正确指出的那样)使用
标题()
作为重定向必须是输出到浏览器的第一件事(因此之前没有
echo
),然后是
exit();
以防止之后出现其他
echo
-ing(这在PHP中也是无效的)

第六:(正如@FunkFortyNiner所指出的)在开发过程中,始终使用
错误报告(E|u ALL | E|u STRICT | E|u NOTICE);

ini\u set('display\u errors',1);
位于PHP顶部。这样,所有错误、警告等都会显式打印在浏览器中,以便您可以调试/清理/修复。

什么不起作用?输出是什么?请停止存储纯文本密码这是一种糟糕的做法,会损害您和您的用户。继续告诉我们“用户名/密码组合错误“;@user969068因为您可能在执行查询之前忘记连接mysql?您的代码中是否有具有正确凭据的mysqli_connect?@FunkFortyNiner非常正确,我在回答中包含了您的评论没有任何效果,我尝试执行echo$password只是为了查看我是否获得了密码,而它没有在发布$时回显@philip任何内容['password']未设置或为空。这是在表单发布之后吗?您能在问题中提供表单代码吗?我添加了整个页面代码是的,在登录表单中,密码字段的名称是
password2
而不是
password
,因此它将是
$\u post['password2']
(或更改输入的
名称
)不客气。在将其联机之前,请先查看其他问题;)