php - 如何检查重复的用户名和/或电子邮件?

标签 php mysql sql pdo

我一直想知道如果在注册过程中用户名和/或电子邮件重复,如何检查 MySQL 表。到目前为止,这是我尝试过但无济于事的方法:

$username = $_POST['username'];
$sq = $db->exec("SELECT * FROM `users` WHERE `username` = '$username'");
if ($sq->rowCount() > 0)
{
    $msg = "That username is already taken.";
    $error = true;
}

$email = $_POST['email'];
$sq = $db->exec("SELECT * FROM `users` WHERE `email` = '$email'");
if ($sq->rowCount > 0)
{
    $msg = "That email is already taken.";
    $error = true;
}

if (!error)
{
    //add to db
}

这给出的错误是Call to a member function rowCount() on a non-object

你能帮忙吗?

最佳答案

PDO::exec() 返回一个整数,因此您的上述代码将因 call to member function rowCount() on a non-object。为此,您应该做的是 SELECT COUNT(*) 以获取行数。

您还可以使用异常来帮助错误处理过程。

像这样:

// Ensure PDO will throw exceptions on error
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

// Turn emulated prepares off
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, FALSE);

try {

  // Check if username is taken
  $stmt = $db->prepare("SELECT COUNT(*) FROM `users` WHERE `username` = :username");
  $stmt->execute(array('username' => $_POST['username']));
  if ($stmt->fetchColumn() > 0) {
    throw new Exception("That username is already taken.");
  }

  // Check if email is taken
  $stmt = $db->prepare("SELECT COUNT(*) FROM `users` WHERE `email` = :email");
  $stmt->execute(array('email' => $_POST['email']));
  if ($stmt->fetchColumn() > 0) {
    throw new Exception("That email is already taken.");
  }

  // Username and email are free

} catch (PDOException $e) {

  // A database error occured

} catch (Exception $e) {

  // Either the username of email is taken

}

如果列中的数据应该是唯一的,它应该有一个唯一的索引,以防止重复插入,并加快基于该列的值搜索的查询。

关于php - 如何检查重复的用户名和/或电子邮件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12433498/

相关文章:

PHP 内爆不适用于单引号?

java - 使用 Retrofit 将图像从 Android 上传到 PHP 服务器

mysql - SequelizeConnectionError : Client does not support authentication protocol requested by server; consider upgrading MariaDB client

java - 无法从 HibernateUtil 类型对非静态方法 getSessionFactory() 进行静态引用

mysql - 在 Mysql 中,如何使用性能模式查找哪些查询导致 cpu% 增加了多少?

java - 具有两个角色的一个用户的输出

mysql - 使用 Group By 连接 2 个表

php - 如何在没有 Composer 作为依赖项的情况下使用具有命名空间的 PHP 库(PSR-0)?

php - 如何在 codeception 中进行 selenium 测试时更改 Laravel 环境?

php - 为什么 MySQL 语句被忽略?