首页 > 解决方案 > 防止多个用户使用同一电子邮件注册

问题描述

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

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

}
?>

标签: phpsqlitepdo

解决方案


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


推荐阅读