mysql - 我似乎无法找到一种方法来检查我的 mysql db (php7) 中是否收到了一封电子邮件
问题描述
我创建了一个 php7 和 mySQL 网站,让用户登录并注册到一个网站。
我已确保用户不能使用与已注册的其他人相同的用户名,但我似乎无法对电子邮件执行相同的操作。
我创建了我的网站,所以当按下注册按钮时,浏览器会指向一个名为 signup.inc.php 的文件。我不知道要更改什么或如何解决它,我一直在寻找解决方案,但我很困惑这个问题,所以帮助会很好:)
我关注的部分是:
if ($resultCheck > 0) {
header("Location: ../signup.php?error=emailtaken");
exit();
这还包括工作用户检查器:
else {
$sql = "SELECT uidUsers AND emailUsers FROM users WHERE uidUsers=? AND emailUsers=?";
$stmt = mysqli_stmt_init($conn);
if (!mysqli_stmt_prepare($stmt, $sql)) {
header("Location: ../signup.php?error=sqlerror");
exit();
}
else{
mysqli_stmt_bind_param($stmt, "ss", $username, $email);
mysqli_stmt_execute($stmt);
mysqli_stmt_store_result($stmt);
$resultCheck = mysqli_stmt_num_rows($stmt);
if ($resultCheck > 0) {
header("Location: ../signup.php?error=usertaken");
exit();
}
else{
mysqli_stmt_bind_param($stmt, "s", $email);
mysqli_stmt_execute($stmt);
mysqli_stmt_store_result($stmt);
$resultCheck = mysqli_stmt_num_rows($stmt);
if ($resultCheck > 0) {
header("Location: ../signup.php?error=emailtaken");
exit();
}
我尝试了一些方法来让它工作,这可能是它混乱的原因,但我似乎无法让数据库中的电子邮件检查工作。它在我的网站上显示“注册成功”,但它应该说的是“已发送电子邮件”。有什么帮助吗?这是完整的页面供参考:
<?php
if (isset($_POST['signup-submit'])){
require 'dbh.inc.php';
$username = $_POST['uid'];
$email = $_POST['mail'];
$password = $_POST['pwd'];
$passwordRepeat = $_POST['pwd-repeat'];
if (empty($username) || empty($email) || empty($password) || empty($passwordRepeat)) {
header("Location: ../signup.php?error=emptyfields&uid=".$username."&mail=".$email);
exit();
}
else if (!filter_var($email, FILTER_VALIDATE_EMAIL) && !preg_match("/^[a-zA-Z0-9]*$/", $username)) {
header("Location: ../signup.php?error=invalidmailuid");
exit();
}
else if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
header("Location: ../signup.php?error=invalidmail&uid=".$username);
exit();
}
else if (!preg_match("/^[a-zA-Z0-9]*$/", $username)) {
header("Location: ../signup.php?error=invaliduid&mail=".$email);
exit();
}
else if($password !== $passwordRepeat){
header("Location: ../signup.php?error=passwordcheck&uid=".$username."&mail=".$email);
exit();
}
else {
$sql = "SELECT uidUsers AND emailUsers FROM users WHERE uidUsers=? AND emailUsers=?";
$stmt = mysqli_stmt_init($conn);
if (!mysqli_stmt_prepare($stmt, $sql)) {
header("Location: ../signup.php?error=sqlerror");
exit();
}
else{
mysqli_stmt_bind_param($stmt, "ss", $username, $email);
mysqli_stmt_execute($stmt);
mysqli_stmt_store_result($stmt);
$resultCheck = mysqli_stmt_num_rows($stmt);
if ($resultCheck > 0) {
header("Location: ../signup.php?error=usertaken");
exit();
}
else{
mysqli_stmt_bind_param($stmt, "s", $email);
mysqli_stmt_execute($stmt);
mysqli_stmt_store_result($stmt);
$resultCheck = mysqli_stmt_num_rows($stmt);
if ($resultCheck > 0) {
header("Location: ../signup.php?error=emailtaken");
exit();
}
else {
//other
$sql = "INSERT INTO users (uidUsers, emailUsers, pwdUsers) VALUES (?, ?, ?) ";
$stmt = mysqli_stmt_init($conn);
if (!mysqli_stmt_prepare($stmt, $sql)) {
header("Location: ../signup.php?error=sqlerror");
exit();
}
else {
$hashedPwd = password_hash($password, PASSWORD_DEFAULT);
mysqli_stmt_bind_param($stmt, "sss", $username, $email, $hashedPwd);
mysqli_stmt_execute($stmt);
header("Location: ../index.php?signup=success");
exit();
}
}
}
}
}
msqli_stmt_close($stmt);
msqli_close($conn);
}
else {
header("Location: ../signup.php");
exit();
}
我尝试修复错误,寻找解决方案,并尝试与用户名相同但 idk
我希望电子邮件不再重复,但在我的网站上,它显示“登录成功”,这是错误的。
解决方案
这是由于 SQL where 子句中的“AND”条件而发生的。仅验证用户名列以检查是否存在。在您的实施中,它正在检查电子邮件和用户名的组合是否存在重复项。如果要验证任一列,请在 where 子句中使用“OR”。
推荐阅读
- angular - ../node_modules/@ng-bootstrap/ng-bootstrap/accordion/accordion.d.ts(1,75) 中的错误:错误 TS2307:找不到模块“@angular/core”
- macos - 哪些版本的 Vagrant 和 VirtualBox 在 MacOS 上兼容
- firebase - 在 Firestore 中忽略 Nil 值的最佳实践
- python - QuantLib-Python 中的现金结算掉期期权定价
- firebase - Flutter Firestore - 如何读写对象数组
- rxjs - 使用重试会导致奇怪的同步行为
- ios - Firestore 搜索多个数组中的值
- ajax - ASP.NET Core Action 适用于 VS,但不适用于浏览器
- javascript - 通过 NPM 导入时扩展 jQuery 库
- python - 如何从上下文菜单中选择较低的项目