我有一个非常基本的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);
}
我似乎无法弄清楚如何更改此代码以包含第二个表中激活码的验证。有人可以帮我一个机会吗?非常感谢你!
答案 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);
这假设您的表结构是:
用户表=用户名,密码 代码表=用户名,代码