【问题标题】:Referring to outer loop variable in nested loop在嵌套循环中引用外部循环变量
【发布时间】:2013-03-24 20:11:14
【问题描述】:

我希望下面的代码循环遍历两个不同的 mysql 表。外部 while 循环应该打印一个产品列表,每个表行都是一个新产品。内部 while 循环应该打印该产品的每个列变量。内部循环设置为查看 $tableheaders 以获取有关打印哪些列的指导。

内部循环是用外部循环数组中的内容回显表格单元格,内部循环数组指定它应该查看外部数组中的哪一列。

这是我的代码;

$tableheaders=mysql_query("SELECT * from `winetable`");

$products=mysql_query("SELECT * FROM `wines`");

while ($row=mysql_fetch_assoc($products)){
    echo '<tr>';
            while ($rowi=mysql_fetch_assoc($tableheaders)){
            $column=$rowi['Title'];
            echo '<td>';
            echo $row[$column];
            echo '</td>';
        }
    echo '</tr>';
    }

它所做的只是变成空白。

现在不使用 mySQLi,因为我的 WebMatrix 在使用它时遇到了一些问题。我认为我的 MySQL 安装已损坏 :)

【问题讨论】:

  • 我会推荐使用 mysqli 函数,因为 mysql 已贬值。除此之外,您的代码看起来不错,请尝试在 $row 和 $rowi 上运行 var_dump() 以查看返回的内容。可能值得向您展示 MySQL 语句和 var 转储以获得更多解决问题的帮助。
  • var_dump 在两者上都返回 bool(false)...
  • 您是否在 while 循环中进行 var 转储?如果是这样,请尝试在您的 while 循环之前在 $tableheaders 和 $products 上运行 mysqli_num_rows()。如果他们返回 0,你就知道你的数据库表是空的,或者你的 MySQL 表名是错误的。如果它们大于 0,则说明 var 转储错误 php.net/manual/en/mysqli-result.num-rows.php
  • 我已经尝试并打印了 MySQL 表中的数组,但它们都显示得很好......

标签: php loops while-loop nested-loops


【解决方案1】:

请阅读以下代码以了解我将如何调试您的代码。我也意识到你需要用 mysql_data_seek() 重置你的数组之一:

$tableheaders=mysql_query("SELECT * from `winetable`");
$products=mysql_query("SELECT * FROM `wines`");

//check the number of results before looping
if(mysql_num_rows($tableheaders) > 0 && mysql_num_rows($products) > 0){

    while ($row=mysql_fetch_assoc($products)){
        echo '<tr>';

        //check what is in the array
        var_dump($row);

        while ($rowi=mysql_fetch_assoc($tableheaders)){

            //check what is in the array
            var_dump($rowi);

            $column=$rowi['Title'];
            echo '<td>';
            echo $row[$column];
            echo '</td>';
        }
        echo '</tr>';

        //reset the $tableheaders array pointer back to 0 for next loop
        mysql_data_seek($tableheaders, 0);
    }
}

【讨论】:

  • 非常感谢!正是 $tableheaders 的重置起到了作用:)
【解决方案2】:

试试这样的。 这样做,您首先将结果加载到一个数组中,您可以进一步操作并在任何时候重用...

<?php

$t = mysql_query("SELECT * FROM `winetable`");
$p = mysql_query("SELECT * FROM `wines`");

if(mysql_num_rows($p) > 0 && mysql_num_rows($t) > 0){
    while ($row=mysql_fetch_assoc($p)){
        $products[] = $row
    }

    while ($row=mysql_fetch_assoc($t)){
        $tableheaders[] = $row;
    }

    foreach($products as $i => $product){ ?>

    <tr><?php
    foreach($tableheaders as $j => $tableheader){
        ?>

        <td><?php echo $row[$tableheader['Title']]; ?></td><?php
    }   
    ?>

    </tr><?php
    }
}

?>

【讨论】:

  • 欢迎来到SO,但看在大家的份上:请不要在你的答案中使用deprecated extensions...看一下链接,注意页面顶部的红框,并查看PDOmysqli_*
【解决方案3】:

查看您的代码,我注意到您没有包含 &lt;table&gt;&lt;/table&gt;(也许您有,但未在您的问题中显示)。能这么简单吗?某些浏览器(即我想)在没有这些&lt;table&gt;tag 时不会显示表格。

包括

echo '<table>';

在第一个循环之前

echo '</table>';

在代码的末尾(循环之后)

您的 htmlsource 中是否出现任何信息?

只是一个提示 我会尝试另一种收集有关葡萄酒的信息的方法......它将创建一个包含所需表格和输出信息的记录集。这将显着提高速度并添加更易读的代码。

类似:

SELECT * FROM `wines` w LEFT JOIN `winetable` wt ON (w.id = wt.id)

当然,正如 Theo Kouzelis 所说,不要使用 mysql_functions。

【讨论】:

    猜你喜欢
    • 2012-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-25
    • 2020-08-05
    相关资源
    最近更新 更多