循环中的PDO循环 - 如何使其正确?

时间:2016-10-12 00:36:00

标签: php mysql pdo

我正在从MySql_和/或MySqli_转移到PDO,我需要一些关于如何正确处理事情的建议。 (学习过程)。在这种情况下,我必须循环通过类别(links_cat)并从另一个表返回响应此类别的所有记录。(链接)。我的代码正在运行,但肯定可以改进。而且我想尽我所能做到这一点(也不要疯狂......):干净,稳固,快速的代码。感谢您提前的建议。

<?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;  

?>    

更新

我加入了表并返回所有结果,但我想仅列出一次类别,而不是每个记录。

<?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 个答案:

答案 0 :(得分: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次。