2013-05-16 34 views
0

我無法使此查詢生效。它只顯示第一個數據庫條目。任何想法不勝感激。無法使PDO SQL查詢正常工作

/*製備*/

$sql = "SELECT personal.firstName, personal.lastName, etc. 
     FROM personal 
     LEFT JOIN exam 
     ON personal.P_ID=exam.P_ID 
     LEFT JOIN contact 
     ON exam.P_ID=contact.P_ID 
     WHERE exam.Level = ? 
     AND exam.Centre!='' ORDER BY exam.Centre"; 

$stmt = $db->prepare($sql); 

/*執行*/$ stmt->執行(陣列($級));

/* Fetch */ 
      $row = $stmt->fetch(PDO::FETCH_ASSOC);  





/* Display */ 
        echo '<table> 
         <tr> 
        <td>Name</td> 
        <td>Surname</td> 
        <td>Paid?</td> 
        <td>Etc</td> 
        <td>Etc</td> 
        <td>Etc</td> 
         </tr>'; 

如果($行) { 的foreach($行爲$鍵=> $值)

   { 
       echo '<td>'; 
       echo $value; 
       echo '</td>'; 
      } 
       echo '</tr>'; 
      } 
     echo '</table>'; 
+2

你並不需要一個參數綁定爲一個空字符串;另一個應該是'exam.Level =:level',我想。 – andrewsi

+4

'WHERE exam.Level =:level' –

+0

而我沒有在您的查詢中看到':centre'佔位符... – prodigitalson

回答

0

我在PDO是新的好,但是從你的代碼我注意到,那裏的查詢中沒有:centre,這樣參數不會綁定?

另一件事是在WHERE exam.Level:level,你確定你的意思是這個而不是:WHERE exam.Level = :level

+0

謝謝。我修改爲'exam.Level =:level',但它仍然不起作用。 如何爲空字符串使用參數?例如'exam.Centre!=''' – Benjamin

3

一個簡單的教程,讓你做對。

  1. 把你的MySQL查詢,工程

    $sql = "SELECT * FROM t WHERE a = $a AND b = '$b'"; 
    
  2. 確保它的工作原理。如果沒有 - 先讓它工作。
  3. 取出每次你在它插變量(所有相應的格式,包括斜槓報價一起),並把一個問號代替它們。

    $sql = "SELECT * FROM t WHERE a = ? AND b = ?"; 
    
  4. 移動這些變量到​​在數組的形式

    $sql = "SELECT * FROM t WHERE a = ? AND b = ?"; 
    $stm = $db->prepare($sql); 
    $stm->execute(array($a,$b)); 
    
  5. 一切正常。

  6. 如果仍然不是 - configure your PDO and PHP in order to see errors if any,請閱讀錯誤消息並採取相應措施。

爲了讓您的數據以正確的格式,你必須使用正確的方法獲取

 $data = $stm->fetchAll(); 
    foreach ($data as $row) { 
     echo $row['id']; 
     // do whatever 
    } 

請參考tag wiki for other methods

+0

另外,如果您將'ATTR_EMULATE_PREPARES'設置爲'true',則可以使用[PDOStatement :: debugDumpParams](http://www.php.net/manual/en/pdostatement。debugdumpparams.php)** **在'execute()'之後。 – Jimbo

+0

謝謝。我得到它運行,但它只顯示數據庫中的第一個條目。當然,我不需要循環顯示符合標準的所有條目? – Benjamin

+0

@ user2304574只使用適當的獲取方法。要獲得所有條目,你必須使用'$ stmt1-> fetchAll()'而不是fetch(),這隻能得到一條記錄 –