2015-12-21 72 views
1

我想检查用户名和电子邮件是否在我的注册脚本中。一个查询,一个表,两个数()

这是我如何检查与查询:

$emailcheck = "SELECT COUNT(email) AS nume FROM members WHERE email = :email"; 
//bindValue 
//execute 
//fetch 
if($rowe['nume'] > 0){ 
$errors[] = "E-mail exist."; 
} 

而且也是我在做同样的事情的用户名;

$usercheck = "SELECT COUNT(username) AS numu FROM members WHERE username = :username"; 
//bindValue 
//execute 
//fetch 
if($rowu['numu'] > 0){ 
$errors[] = "Username taken."; 
} 

*

我想往前走一步,并处理所有的东西用一个查询。

但我不能想出这样的问题。

我想:

$check = "SELECT COUNT(username) AS numu and COUNT(email) AS nume FROM members WHERE username = :username OR email = :email"; 

,但可能这是荒谬的。

如何处理我想要的一个查询?

后,我要检查这样的:

if($row['numu'] > 0){ 
$errors[] = "Username taken."; 
} 
if($rowe['nume'] > 0){ 
$errors[] = "E-mail exist."; 
} 

因此,这将是更少的代码,而不是为第二次两次bindValue, execute, fetch连接相同的表。

+0

凡(用户名= usrrname或电子邮件=电子邮件)..尝试 – devpro

+0

正如你可以看到有我的帖子,我试了一下,先生:) – LetsSeo

+0

不小的差别在一个支架 – devpro

回答

3

你可以做Union All联合这些查询:

SELECT COUNT(email) AS num FROM members WHERE email = :email 
UNION ALL 
SELECT COUNT(username) AS num FROM members WHERE username = :username 

然后提取2个根据行。

OR,MySQL允许这事

SELECT 
    (SELECT COUNT(email) FROM members WHERE email = :email) as nume, 
    (SELECT COUNT(username) FROM members WHERE username = :username) as numu 

,如果你想1行2列。

只有当您需要查看哪一个已经存在时才这样做。否则,只是这样做:

SELECT 1 FROM members WHERE email = :email OR username = :username LIMIT 1 

是的,可以考虑不做count()因为你并不需要计算所有行。你只需要停下来,如果你找到一个。因此,要么做一个LIMITIF EXISTS()

+0

我尝试了第二块代码,它实际上搜索结果所以我为未来的学习者写这篇文章,还要感谢'LIMIT'的提示 – LetsSeo

0

你可以指望之间取出and后尝试这种

$check = "SELECT COUNT(username) AS uname , 
     COUNT(email) AS uemail FROM members 
     WHERE (username = :username OR email = :email)"; 
+0

这看起来和他已经试过的不一样吗? – RiggsFolly

+0

这次它告诉我用户名和电子邮件存在于d atabase,当它们中只有一个存在时。 – LetsSeo

3

我不认为你真的需要计数。假设您想检查用户名或电子邮件是否已存在,因为它们必须在您的用户表上唯一,您可以这样做:

首先,为数据库中的每个列添加唯一索引。你可能已经有了这个,但是如果你希望这些值是唯一的,这将确保即使你的PHP代码由于某种原因不能这样做。

然后你可以使用此查询:

SELECT username, email FROM members WHERE username = :username OR email = :email 

这将返回零,一排或两排,其中:

  • 0 =既不是用户名,也没有电子邮件发现
  • 1 =发现有一行有用户名,电子邮件或两者都有
  • 2 =在一行中发现用户名,在另一行中找到电子邮件

然后,您可以遍历结果,将它们与用户输入进行比较,并设置错误。

while ($row = //fetch) { 
    if ($row['username'] == $username) { 
     $errors[] = "Username taken."; 
    } 
    if ($row['email'] == $email) { 
     $errors[] = "E-mail exist."; 
    } 
} 
+0

+1,但需要一些提及:当你在数据库中进行比较时,你可能正在使用通常的CI整理,所以'Alex'='alex'将评估为true,与PHP相反,比较是二进制。因此,你必须在PHP中处理这个问题,并确保算法与数据库中的排序规则匹配。 – AlexanderMP