阻止多个用户使用同一封电子邮件注册



正如我在标题中所说,我试图阻止使用数据库中已经存在的电子邮件进行注册。我用下面的代码尝试了一下,但它仍然在注册新用户,尽管电子邮件是一样的。我应该修复什么?

<?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。

相关内容

最新更新