我一直想知道如果在注册过程中用户名和/或电子邮件重复,如何检查 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/