【问题标题】:While Loop within While Loop - should I be using Foreach Loop?While 循环内的 While 循环 - 我应该使用 Foreach 循环吗?
【发布时间】:2011-02-28 21:23:36
【问题描述】:

我正在尝试从 MySQL 中的多个表中获取数据(这些表包括可在我的电子商务网站上购买的每件商品的选项数据)。从购物车会话中提取的值如下:

foreach($_SESSION['cart'] as $id => $data)
            {

            // Calulate total for each item
            $subtotal = $data['quantity'] * $data['price'];
            $total += $subtotal;

            // This gets the Cart sessions unique ID, so I can get the options from the database using it!
            $sessionidforoptions = $data['uniquesessid'];


            //Out put shopping cart data
            echo    "TABLE ROWS WITH EACH ITEM GO HERE (Product, Qty, Price for item etc...";

然后我使用 $sessionidforoptions 值从数据库中获取选项:

// Get options IDs from Database
            foreach($_SESSION['sessionoptions'][$sessionidforoptions] as $id2 => $data2) { $$id2 = $data2; }

                if (isset($option1) && ($option1 != "")) { $list = $option1; }
                if (isset($option2) && ($option2 != "")) { $list .= ",".$option2; }
                if (isset($option3) && ($option2 != "")) { $list .= ",".$option3; }

// Query Database
$optionsquerysql = "SELECT * from productOptions WHERE productOptionsID IN ('". $list ."')";
$optionsresultsql= mysql_query($optionsquerysql) or die(mysql_error());

然后输出选项:

while   ($optionssql = mysql_fetch_array($optionsresultsql)) {

                            $optionNamesID = $optionssql["optionNamesID"];
                            $optionValue = $optionssql["optionValue"];

                            // Get option names from databsae
                            $optionsnamesquerysql = "SELECT * from optionNames WHERE optionNamesID = ".$optionNamesID."";
                            $optionsnamesresultsql= mysql_query($optionsnamesquerysql) or die(mysql_error());

                                //Output options names + options
                                while   ($optionnamessql = mysql_fetch_array($optionsnamesresultsql)) {

                                        $optionName = $optionnamessql['optionName'];    
                                        echo $optionName.': '.$optionValue.'<br />';                            
                                }

                    }

这几乎行得通!该会话为购物车中的每个项目存储了 3 个选项(尺寸、颜色等)

我得到以下信息:

项目 1 - £20.00 尺寸:小号

商品 2 - £22.00 尺寸:中号

第 3 项 - £45.00 尺寸:大号

这是我应该得到的:

项目 1 - 20.00 英镑 - 尺寸:小号 - 颜色:黑色 - 腰带:小号

商品 2 - 22.00 英镑 - 尺寸:中号 - 颜色:蓝色 - 腰带:中号

商品 3 - £45.00 尺寸:大号 - 颜色:粉色 - 腰带:大号

如你所见,最后一个while循环每次只输出第一个选项

while   ($optionnamessql = mysql_fetch_array($optionsnamesresultsql)) { OPTION OUTPUT }

我应该在这里使用 foreach 而不是 while 循环吗?

非常感谢任何人提供的任何建议。我意识到我的代码不是很干净。我还在学习……对此我很抱歉。

感谢您提供的任何建议

【问题讨论】:

    标签: php mysql foreach while-loop


    【解决方案1】:

    在循环数据时尝试打印$optionsquerysql$optionsnamesquerysql 的值。然后确保 SQL 语句看起来像您期望的那样。最后,复制 SQL 并使用 PHPMyAdmin、SQLYog 或仅使用 mysql 命令行实用程序直接针对数据库运行它。确保返回的结果符合您的预期。

    从技术上讲,您使用的控制结构应该按照您的预期工作。

    更新

    我认为您的查询 SELECT * from productOptions WHERE productOptionsID IN ('". $list ."') 不会像您期望的那样工作。无论$list 的值是什么,您都将它放在SQL 字符串中的一组单引号内,因此MySQL 会将其视为单个字符串值,然后尝试将其转换为整数。我怀疑这是你的问题。尝试删除单引号,以便查询只是SELECT * from productOptions WHERE productOptionsID IN (". $list .")

    附带说明,您应该阅读 SQL 注入攻击,并确保在 SQL 查询中使用数据之前对数据进行清理。

    【讨论】:

    • 很好的建议。现在将尝试 PHPMyAdmin 的事情!谢谢
    • 认为 MySQL 有问题:当我输入这个时:SELECT * FROM productOptions WHERE productOptionsID IN ('1,2,3,4') 我只得到一个结果。这就是脚本中的这一行:$optionsquerysql = "SELECT * from productOptions WHERE productOptionsID IN ('". $list ."')"; 我的查询有误吗?
    • 谢谢克里斯。非常感谢您的帮助。将在网站上线之前清理所有数据。再次感谢
    【解决方案2】:

    就我个人而言,我只在无法预先计算循环大小时使用 while。

    For-next 是一件很棒的事情。

    //编辑//

    一个基本的for-next-loop:

    for($i=0;$i<10;$i++) {
      echo $i . '<br />';
    }
    

    现在,你并不总是知道你可以去多少次(没有最终价值), 就像读取大块文件时一样。然而,记录集下降 介于两者之间。

    大多数情况下,记录集并不大,可以很容易地预加载到 一个数组,如

    $rs = array();
    while ($rs[] = mysql_fetch_assoc($result));
    

    现在 $rs 包含一个包含所有记录的灵活数组,您可以 在输出之前执行计算、高级字段修改或任何操作, 全部用for-next...

    for($i=0;$i<sizeof($rs);$i++) {
      //creating a new 'field'
      $rs[$i]['Fullname'] = $rs[$i]['Firstname'] . ' ' . $rs[$i]['Lastname'];
    }
    

    在输出时,只需再次循环,使用 for-next

    (下一个词没有在 php 中使用,因为它是 C 的一种派生形式,只是一个 '}'。 然而,Basic 和 Pascal 使用它)

    敬礼, //t

    【讨论】:

    • 可以扩展一下吗?我从未听说过 for-next 循环!
    猜你喜欢
    • 2016-03-14
    • 2016-04-24
    • 1970-01-01
    • 1970-01-01
    • 2017-05-28
    • 1970-01-01
    • 2013-10-01
    • 1970-01-01
    • 2011-06-19
    相关资源
    最近更新 更多