我正在尝试从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循环吗?
真的很感激任何人都可以提供的建议。我意识到我的代码不是很干净。我还在学习......对此我很抱歉。
感谢您提供任何建议
答案 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查询中使用它之前清理数据。