PHP PDO sql查询和结果

问题描述:

我遇到了使用PDO实现SQL查询的问题。PHP PDO sql查询和结果

$friend_emails = $pdo->prepare("SELECT DISTINCT User2 
        FROM members 
        WHERE User1 = '$user' 
        UNION 
        SELECT DISTINCT User1 
        FROM members 
        WHERE User2 = '$user'"); 
$friend_emails->execute(); 

for($i=0; $row = $friend_emails->fetch(); $i++) { 
    echo "foo"; 
} 

“foo”根本不显示。我var_dumped $行和$ friend_emails->取()这两者都是一个

boolean false 

,所以我不能完全确定这是为什么,我认为这将返回数据的数组。

任何帮助,非常感谢!

+0

执行()调用之后,检查$ friend_emails-> errorInfo()以获取任何错误消息。另外,如果你使用'prepare()'语句,你不应该在那里插入动态值,而是在后面的'execute()'中。 – Sirko 2013-05-14 09:37:00

+0

顺便说一句,为什么在使用字符串插值时使用'prepare'而不是真的准备好你的语句? – 2013-05-14 09:38:26

+0

@Sirko我添加了 - > errorInfo(),我需要回显它吗?如果没有,那么就没有错误。 – 2013-05-14 09:40:53

使用,而这里

while($row = $friend_emails->fetch()) { 
    echo "foo"; 
} 

您的循环将不会执行,因为

for($i=0; $row = $friend_emails->fetch(); $i++) 
      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ // here $i is not present 

正确的格式将是

for($i=0; $i <= count($friend_emails->fetch()); $i++) 
+0

因此,我应该使用while循环还是新的for循环? – 2013-05-14 09:44:59

+0

@CoreyThompson你可以尝试这两个,但虽然比从db获取记录更好, – 2013-05-14 09:46:10

+0

刚刚意识到我的问题是一个SQL问题,但while循环更好,所以我使用它。谢谢! – 2013-05-14 09:46:10

更改您的代码

$friend_emails = $pdo->prepare("SELECT DISTINCT User2 
        FROM members 
        WHERE User1 = :user 
        UNION 
        SELECT DISTINCT User1 
        FROM members 
        WHERE User2 = :user"); 
$friend_emails->execute(array('user' => $user)); 
+0

我现在已经改变它到这个,但for循环仍然不输出“东西”:( – 2013-05-14 09:42:18

+0

我的错误是在SQL中,对不起我的坏。感谢您的帮助和 – 2013-05-14 09:46:40

你的问题是错误的变量名称

$pdo->prepare()返回的变量不包含单个电子邮件,但包含PDO语句。因此它应该被相应地命名。
还没有使用预处理语句,而你应该

所以,莫使代码一致和易读:

$sql = "SELECT DISTINCT User2 FROM members WHERE User1 = ? 
     UNION 
     SELECT DISTINCT User1 FROM members WHERE User2 = ?"; 
$stmt = $pdo->prepare(); 
$stmt->execute(array($user,$user)); 
$emails = $stmt->fetchAll(PDO::FETCH_COLUMN, 0) 

,现在你有你的电子邮件在一个方便的数组,你可以遍历:

foreach($emails as $email) { 
    echo $email; 
} 

你也需要配置PHP和PDO作为this answer证明能够看看是否有任何发生的所有错误(如曲可能是整个代码失败的可能原因)