php - 防止多个用户使用同一电子邮件注册
问题描述
正如我在标题中所说,我试图阻止使用数据库中已经存在的电子邮件进行注册。我使用下面的代码进行了尝试,但即使电子邮件相同,它仍在注册新用户。我应该修复什么?
<?php
$msg = "";
if (isset($_POST['submit'])) {
$con = new PDO('sqlite:database.sqlite');
$name = $_POST['name'];
$email = $_POST['email'];
$password = $_POST['password'];
$cPassword = $_POST['cPassword'];
$chk = $con->prepare("SELECT * FROM users WHERE email = :email");
$chk->bindParam(':email', $email);
$chk->execute();
if ($chk->rowCount() > 0):
$msg = 'That email is not available!';
elseif ($chk->rowCount() == 0):
if ($password != $cPassword)
$msg = "Passwords don't match!";
else {
$hash = password_hash($password, PASSWORD_BCRYPT);
$con->query("INSERT INTO users (name,email,password) VALUES ('$name', '$email', '$hash')");
$msg = "Registration successful!";
}
else:
$msg = 'Registration not successful!';
endif;
}
?>
解决方案
从 php 文档:
对于大多数数据库,PDOStatement::rowCount() 不返回受 SELECT 语句影响的行数。相反,使用 PDO::query() 发出 SELECT COUNT(*) 语句,其谓词与预期的 SELECT 语句相同,然后使用 PDOStatement::fetchColumn() 检索匹配的行数。
rowCount
主要用于DELETE
语句的情况下或UPDATEs
但不用于SELECTs
.
对于您的情况,最简单的方法是将您的查询更改为直接返回具有相同电子邮件的用户数量:
$chk = $con->prepare("SELECT count(*) FROM users WHERE email = :email");
然后,您可以通过以下方式获取值:
$count = $chk->fetchColumn();
然后在 if 语句中使用 $count。
推荐阅读
- python - Python 句柄强化路径操作
- swift - 上下纸牌游戏 - Swift 4.2
- javascript - 使用 AngularJS 1.6 创建具有多个输入的多个表
- javascript - 如何将排序数据分配给不可变对象
- c# - 在代码向前移动之前无法通过 MessageDialog 检索用户的输入
- python - 将列表的字符串表示形式转换为数据框列中的列表
- vb.net - 如何读取Word模板中的excel对象并转换为表格
- scala - NumberFormatException 空 Scala.js 测试
- mysql - 如何显示每个类别的最后三篇文章?
- for-loop - 如何使这个 VHDL 'for' 循环在 modelsim 上正常工作?