2014-10-03 43 views
1

给“未定义的变量”的错误,我抓住从下面的SQL语句计数统计($hits):使用或在SQL语句在PHP

SELECT COUNT(*) AS hits FROM users 
    WHERE password = :password 
    AND username = :username 

拼抢变量在while()循环在这里工作正常,它不是,直到我尝试这个办法:

SELECT COUNT(*) AS hits FROM users 
    WHERE password = :password 
    AND (username = :username OR email = :username) 

当我尝试拉,我得到一个“undifined变量”错误“打”作为$hits = $row['hits'];

我想我们呃能够使用用户名或电子邮件地址登录。谁能告诉我为什么第一个SQL语句工作正常,但第二个不?

我的PHP如下:

// COUNT HITS 
$COUNT_HITS = $DBH->prepare("SELECT COUNT(*) AS hits FROM users WHERE password = :password AND (username = :username OR email = :username)"); 
$COUNT_HITS->bindParam(':password', $password); 
$COUNT_HITS->bindParam(':username', $username); 
$COUNT_HITS->execute(); 
while($row = $COUNT_HITS->fetch(PDO::FETCH_ASSOC)){ 
    $hits= $row['hits']; 
} 
+0

是行定义的吗? – 2014-10-03 16:01:00

+0

我已经尝试了SQL Server Management Studio 2012中的第二条语句并替换了变量,它会为'hits'返回一个值。 PHP不喜欢在第二个语句中使用':username'吗? – proPhet 2014-10-03 16:01:49

+0

你可能需要绑定两次 - 请分享你的php。 – 2014-10-03 16:02:33

回答

1

问题

看看这里:

用户名= :用户名或电子邮件= :用户名

可以在PDO做到这一点,而不是默认的至少

解决方案

添加第三个PARAMS

用户名= :用户名或电子邮件= :username_email

and bind到相同的$username价值,没关系。

$COUNT_HITS->bindParam(':password', $password); 
$COUNT_HITS->bindParam(':username', $username); 
$COUNT_HITS->bindParam(':username_email', $username); 
$COUNT_HITS->execute(); 
+1

我测试了OP的代码,它对我来说工作得很好。我认为问题出在桌子上。 – 2014-10-03 18:27:03

+0

问题可以使用这个答案来解决,尽管解决方案之前发布为评论。我给@Stv一个机会发布答案,如果这没有发生我会接受这个答案。 – proPhet 2014-10-03 18:32:19

+0

@fred -ii-我相信你已经开启了模拟,不能使用默认 – meda 2014-10-03 18:34:30

2

好吧,这里一个合适的回答:

$COUNT_HITS = $DBH->prepare("SELECT COUNT(*) AS hits FROM users WHERE password = :password AND (username = :username OR email = :email)"); 
$COUNT_HITS->bindParam(':password', $password); 
$COUNT_HITS->bindParam(':username', $username); 
$COUNT_HITS->bindParam(':email', $username); 

希望这个作品。