2013-05-14 97 views
-1

我遇到了使用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

回答

1

使用,而這裏

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

-1

更改您的代碼

$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

1

你的問題是錯誤的變量名稱

$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證明能夠看看是否有任何發生的所有錯誤(如曲可能是整個代碼失敗的可能原因)