PHP:登录系统,查询第二个表?

时间:2018-05-13 11:24:06

标签: php mysql

我有一个非常基本的PHP登录系统,我现在正在改变产品。用户可以使用用户名/密码进行注册,并将信息存储到数据库中。但是,我有一个名为" act_codes"其中有一行称为" act"。我想在该表中存储激活码。例如,我会" Code1" "代码2"和#34; Code3"在行为行。用户将使用他们的用户名和密码登录,但他们还需要输入他们的激活码,该激活码是通过我的电子商务平台生成并通过电子邮件发送给他们。

到目前为止,我有这个用于验证用户名/密码的工作正常:

    if(empty($username_err) && empty($password_err) && empty($code_err)){
    $sql =   "SELECT username, password FROM users WHERE username = ?";

    if($stmt = mysqli_prepare($link, $sql)){
        mysqli_stmt_bind_param($stmt, "s", $param_username);
        $param_username = $username;
        if(mysqli_stmt_execute($stmt)){
            mysqli_stmt_store_result($stmt);
            if(mysqli_stmt_num_rows($stmt) == 1){                    
                mysqli_stmt_bind_result($stmt, $username, $hashed_password);
                if(mysqli_stmt_fetch($stmt)){
                    if(password_verify($password, $hashed_password)){
                        session_start();
                        $_SESSION['username'] = $username;  
                        $_SESSION['code'] = $code;                          
                        header("location: welcome.php");
                    } else{
                        $password_err = 'The password you entered was not valid.';
                    }
                }
            } else{
                $username_err = 'No account found with that username.';
            }
        }   
    }
    mysqli_stmt_close($stmt);
}

我似乎无法弄清楚如何更改此代码以包含第二个表中激活码的验证。有人可以帮我一个机会吗?非常感谢你!

2 个答案:

答案 0 :(得分:2)

一些要点:

  • 作为侧点:将session_start()放在脚本顶部
  • 并在die
  • 之后立即加入header("Location:...);声明
  • 这两行是错误的顺序吗?

    mysqli_stmt_bind_param($stmt, "s", $param_username);
    $param_username = $username;
    

    应该先设置它们然后然后绑定。

回答您的问题

您似乎想要MySQL JOIN,例如:

 SELECT users.username, users.password act.var_code 
 FROM users 
 LEFT JOIN act ON users.userid = act.userid
 WHERE username = ?

这是一个粗略的结果,因为我看不到你的表格结构,但可以自由地阅读other Stack Overflow questions类似的徒劳。

您使用的type of MySQL join完全取决于您。我仅以LFET JOIN为例。

同样由d3t0x in their answer引用,您还需要绑定MySQL返回的其他数据。

答案 1 :(得分:0)

为什么不使用内部联接,这意味着您可以继续只使用一个查询:

$sql1 ="SELECT users.username, users.password, codes.code FROM users INNER JOIN codes ON users.username = codes.username";

您还需要将返回的代码绑定到变量,以便将其与会话中的代码进行比较。

类似的东西:

mysqli_stmt_bind_result($username, $hashed_password, $code);

这假设您的表结构是:

用户表=用户名,密码 代码表=用户名,代码