我有一个非常基本的PHP登录系统,我现在正在修改一个产品。用户能够使用用户名/密码进行注册,并且该信息被存储在数据库中。但是,我有一个名为"act_codes“的单独表,其中有一个名为"act”的行。我想把激活码存储在那个表中。例如,我在动作行中有"Code1“、"Code2”和"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);
}我似乎想不出如何修改这段代码,使其也包含来自第二个表的激活码的验证。有谁能碰巧帮我一下吗?非常感谢!
发布于 2018-05-13 19:37:33
以下是一些要点:
session_start()放在scriptheader("Location:...); die语句。这两行的顺序是错误的吗?mysqli_stmt_bind_param($stmt,"s",$param_username);$param_username = $username;
应该先设置它们,然后再进行绑定。
回答你的问题
您似乎想要一个这样的 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。
您使用的 of MySQL join完全由您决定。我只是简单地以LFET JOIN为例。
由于还被d3t0x in their answer引用,因此还需要绑定由MySQL返回的附加数据。
发布于 2018-05-13 19:43:51
为什么不使用内部连接,这将意味着您可以继续使用一个查询:
$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);这里假设您的表结构是:
用户表=用户名,密码代码表=用户名,代码
https://stackoverflow.com/questions/50315589
复制相似问题