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

arg*_*eus 2 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
}
Run Code Online (Sandbox Code Playgroud)

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

能否请你帮忙?

Dav*_*dom 5

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

}
Run Code Online (Sandbox Code Playgroud)

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