2016-10-12 64 views
0

我正在從MySql_和/或MySqli_轉向PDO,並且我需要一些關於如何正確使用的建議。 (學習過程)。在這種情況下,我必須通過類別(links_cat)進行循環,並從另一個表中返回所有對此類別作出響應的記錄(鏈接)。我有代碼正在工作,但肯定可以改進。我想這樣做的專業,我可以(未做瘋狂太..(:只要乾淨,紮實快速的代碼謝謝你的忠告提前循環中的PDO循環 - 如何使它正確的方式?

<?php 

// Get Link Categories 
$links_cat = $pdo->prepare("SELECT * FROM links_cat"); 

$links_categories = array(); 
if ($links_cat->execute()) { 
    while ($row = $links_cat->fetch(PDO::FETCH_ASSOC)): 
     $links_categories[] = $row; 
     $link_cat_id = $row['id']; 
     $link_cat_name = $row['name']; 
     echo $link_cat_name . "<br/>"; 

     // Get Links in current Category 

     $links = $pdo->prepare("SELECT * FROM links WHERE category = '$link_cat_id' ORDER BY name"); 
     $links->execute(); 

      while ($link_row = $links->fetch()): 
      echo $link_name = $link_row['name']. "<br/>"; 
      endwhile; 

    endwhile; 
} 

$pdo = null; 

?>  

UPDATE

我加入表和返回所有的結果,但我想列出類別只有一次,而不是每個記錄

<?php 
$links_cat = "SELECT links_cat.name AS linkcat, links.link AS linkname FROM links_cat INNER JOIN links ON links.category=links_cat.id"; 
foreach($pdo->query($links_cat) as $row) { 
echo $row['linkcat'] . "<br>"; 
echo $row['linkname'] . "<br>"; 
} 
?> 

清單現在的問題是這樣的:

Cat 1 
    - L1 
Cat 1 
    - L2 
Cat 2 
    - L3 
Cat 2 
    - L4 

我正在尋找房源是這樣的:

Cat 1 
- L1 
- L2 
Cat 2 
- L3 
- L4 
+1

在數據庫中使用JOIN,而不是在客戶端。 'SELECT * FROM links_cat lc JOIN links c ON l.category = lc.id' 您的代碼有SELECT N + 1問題。 –

+0

可以這麼友好地給出一些關於如何顯示數據的代碼示例(我更新了我的問題,以便您可以看到我希望如何將這些數據顯示出來)。 Cuold還告訴我更多關於SELECT N + 1的問題(你在這裏是什麼意思?) – Nita

回答

1

嘗試改變這樣

// ensure record is ordered by category name 
$links_cat = "SELECT links_cat.name AS linkcat, links.link AS linkname FROM links_cat INNER JOIN links ON links.category=links_cat.id ORDER BY links_cat.name"; 

$prevCat = ''; 
foreach($pdo->query($links_cat) as $row) { 
    // if category name different from previous, show it 
    if($row['linkcat'] != $prevCat) { 
     echo $row['linkcat'] . "<br>"; 
     $prevCat = $row['linkcat']; 
    } 
    echo $row['linkname'] . "<br>"; 
} 

SELECT N + 1的問題你的代碼就是SELECT查詢在循環中執行的代碼問題。如果循環計數較高,則會降低性能。它被稱爲SELECT N + 1,因爲查詢在循環中執行N次,併爲初始查詢執行1。

+0

這很酷,非常感謝,效果很好,我做了一些速度比較,是的很好。 – Nita