2

我一直想知道如果在注册期间用户名和/或电子邮件重复,如何签入 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

能否请你帮忙?

4

3 回答 3

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

}

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

于 2012-09-15T00:23:49.063 回答
2

为了避免潜在的竞争条件,您应该简单地将您的用户名和电子邮件字段设置为唯一索引。

当您尝试插入重复行时,您的数据库引擎会给您一个特定的错误代码,对于 MySQL,它是 1062。

如果查询失败,则检查错误号是否为重复行的错误号,并据此显示消息。

至少,您的列应该是唯一索引,以防止在数据库级别出现重复。

于 2012-09-15T00:35:30.527 回答
0

请说明 $db 的类型,假设它是 sqllite3。

在http://php.net/manual/en/sqlite3.exec.php查看 SQLLITE3::exec() 的文档.. 据它所说,它仅对 (UPDATE, INSERT, DELETE) 有效并返回布尔值. 因此,您的代码可能不会运行。

如果根据您的标签,您正在使用 MySQL。我相信您需要查看 mysql/mysqli 扩展、mysql_query() 和 mysqli_query(),或者如果 $db 是 mysqli 类型,则 $db -> query()。

于 2012-09-15T00:23:38.443 回答