While While循环中的循环 - 我应该使用Foreach循环吗?

时间:2011-02-28 21:23:36

标签: php mysql foreach while-loop

我正在尝试从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循环吗?

真的很感激任何人都可以提供的建议。我意识到我的代码不是很干净。我还在学习......对此我很抱歉。

感谢您提供任何建议

2 个答案:

答案 0 :(得分:1)

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

For-next是一件好事。

// //编辑

基本的下一循环:

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

现在,你并不总是知道你能走多少次(没有最终价值), 喜欢读大块文件的时候。然而,记录集下降 介于两者之间。

大多数情况下,记录集并不大,可以轻松预装 一个数组,如

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

现在$ rs包含一个包含所有记录的灵活数组,您可以 执行计算,高级字段修改或输出前的任何内容, 所有与下一个......

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然后使用它)

redgards, //吨

答案 1 :(得分: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查询中使用它之前清理数据。