Php while循环中有什么问题吗?
我有一张商店积分表 和订单表 我想要的输出与此类似,但基于Php while循环中有什么问题吗?,php,mysql,arrays,while-loop,Php,Mysql,Arrays,While Loop,我有一张商店积分表 和订单表 我想要的输出与此类似,但基于存储信用订单日期和时间和存储订单日期和时间: 到目前为止我已经尝试过的代码: <?php $table = ''; $queryToGetStoreCredit = "SELECT * FROM store_credits_orders WHERE SCO_CustEmailAdd = '".$_SESSION["Customer"]["email"]."'"; $validate->Query($queryToGetS
存储信用订单日期和时间
和存储订单日期和时间
:
到目前为止我已经尝试过的代码:
<?php
$table = '';
$queryToGetStoreCredit = "SELECT * FROM store_credits_orders WHERE SCO_CustEmailAdd = '".$_SESSION["Customer"]["email"]."'";
$validate->Query($queryToGetStoreCredit);
if ($validate->NumRows() >= 1) {
while ($rows_sco = $validate->FetchAllDatas()) {
$used = $i = 0;
$table .= '<tr>';
$table .= '<td>'.$rows_sco["SCO_OrderCode"].'</td>';
$table .= '<td>--</td>';
$table .= '<td>'.$rows_sco["SCO_OrderDate"].'</td>';
$table .= '<td>--</td>';
$table .= '<td>'.$rows_sco["SCO_Purchase_Amount"].'</td>';
$table .= '<td>'.$rows_sco["SCO_Credit_Alloted"].'</td>';
$table .= '<td>'.$used.'</td>';
$table .= '<td>'.( $rows_sco["SCO_Credit_Alloted"] - $used ).'</td>';
$table .= '</tr>';
$validate2 = new Validation();
$queryToGetOrder = "SELECT * FROM orders WHERE CustEmailAdd = '".$rows_sco["SCO_CustEmailAdd"]."'";
$validate2->Query($queryToGetOrder);
while ($row = $validate2->FetchAllDatas()) {
$table .= '<tr>';
$table .= '<td>--</td>';
$table .= '<td>'.$row["OrderCode"].'</td>';
$table .= '<td>--</td>';
$table .= '<td>'.$row["OrderDate"].'</td>';
$table .= '<td>--</td>';
$table .= '<td>--</td>';
$table .= '<td>'.$row["AppliedCredits"].'</td>';
$table .= '<td>'.($rows_sco["SCO_Credit_Alloted"] - $row["AppliedCredits"]).'</td>';
$table .= '</tr>';
}
}
}
?>
我想要实现的是,无论何时购买门店积分,信息都将插入门店积分订单表中。现在,当同一个用户来下订单并兑换store_信用(小于等于,他在他的帐户中有),除了在orders表中插入之外,数据库中不会有任何更新
但是当用户登录时,他应该能够看到他何时购买了商店积分和/或何时兑换了商店积分。所有这些事件都应该按最先发生的事件排序,无论是购买还是赎回。我和@user3514160谈过,我很清楚他想要什么。基本上,数据被正确插入。他唯一想要的就是以正确的方式显示数据
您的查询应如下所示
(SELECT
SCO_Id,
SCO_OrderCode,
SCO_CustEmailAdd,
SCO_Purchase_Amount,
SCO_Credit_Alloted,
SCO_OrderDate,
SCO_OrderIP,
null AS OrderId,
null AS OrderCode,
null AS CustEmailAdd,
null AS AppliedCredits,
null AS OrderDate,
'store_credits_orders' AS tableName
FROM `store_credits_orders` AS credits_orders WHERE `SCO_CustEmailAdd` = '".$_SESSION["Customer"]["email"]."')
UNION
(SELECT
OrderId,
OrderCode,
CustEmailAdd,
AppliedCredits,
OrderDate
null AS SCO_Id,
null AS SCO_OrderCode,
null AS SCO_CustEmailAdd,
null AS SCO_Purchase_Amount,
null AS SCO_Credit_Alloted,
OrderDate AS SCO_OrderDate,
null AS SCO_OrderIP,
'store_orders' AS tableName
FROM `store_orders` AS orders WHERE `SCO_CustEmailAdd` = '".$_SESSION["Customer"]["email"]."')
ORDER BY `SCO_OrderDate` ASC
这是在一个结果中获取所有行所必需的。我们通过以下方式来实现这一点
UNION需要两个表具有相同数量的同名列。这就是为什么我们添加列名为null的空列
和带有查询的PHP
<?php
$table = '<table>';
// Query to get all rows from both tables
$queryToGetStoreCredit =
"(SELECT
SCO_Id,
SCO_OrderCode,
SCO_CustEmailAdd,
SCO_Purchase_Amount,
SCO_Credit_Alloted,
SCO_OrderDate,
SCO_OrderIP,
null AS OrderId,
null AS OrderCode,
null AS CustEmailAdd,
null AS AppliedCredits,
null AS OrderDate,
'store_credits_orders' AS tableName
FROM `store_credits_orders` AS credits_orders WHERE `SCO_CustEmailAdd` = '".$_SESSION["Customer"]["email"]."')
UNION
(SELECT
OrderId,
OrderCode,
CustEmailAdd,
AppliedCredits,
OrderDate
null AS SCO_Id,
null AS SCO_OrderCode,
null AS SCO_CustEmailAdd,
null AS SCO_Purchase_Amount,
null AS SCO_Credit_Alloted,
OrderDate AS SCO_OrderDate,
null AS SCO_OrderIP,
'store_orders' AS tableName
FROM `store_orders` AS orders WHERE `SCO_CustEmailAdd` = '".$_SESSION["Customer"]["email"]."')
ORDER BY `SCO_OrderDate` ASC";
$validate->Query($queryToGetStoreCredit);
if ($validate->NumRows() >= 1) {
// Starting balance. This could be some other number, for example if viewing some certain period of orders etc.
$balance = 0;
while ($row = $validate->FetchAllDatas()) {
// Add to balance
if($row['tableName'] == 'store_credits_orders' && (int)$row['SCO_Credit_Alloted'] > 0){
$balance += (int)$row['SCO_Credit_Alloted']
}
// Remove from balance
else if($row['tableName'] == 'store_orders' && (int)$row['AppliedCredits'] > 0){
$balance -= (int)$row['AppliedCredits'];
}
$table .= '<tr>';
$table .= '<td>'.$row["SCO_OrderCode"].'</td>';
$table .= '<td>'.$row["OrderCode"].'</td>';
$table .= '<td>'.(($row['tableName'] == 'store_credits_orders') ? $row["SCO_OrderDate"] : '').'</td>';
$table .= '<td>'.$row["OrderDate"].'</td>';
$table .= '<td>'.$row["SCO_Purchase_Amount"].'</td>';
$table .= '<td>'.$row["SCO_Credit_Alloted"].'</td>';
$table .= '<td>'.$row["AppliedCredits"].'</td>';
$table .= '<td>'.$balance.'</td>';
$table .= '</tr>';
}
}
$table .= '</table>';
echo $table;
?>
您的更新查询在哪里?您的问题也有点不清楚?哪个更新查询?还有什么?你问“我需要在兑换和/或购买时更新商店积分。”?我要问的那个问题需要在运行时完成。。。我们不会对此提出任何疑问。@halfer谢谢您的通知,先生。我不知道这一切。我将确保下次不会发生这种情况。最好在sql联合中显式地声明返回的列,而不是使用“*”(返回所有列)。原因是,如果向任一表中添加新列,则查询将失败。此外,您还依赖于两个表中顺序相同的相应列。是的,编辑了我的答案@RyanVincent,依赖相同的列顺序是什么意思?如果我们为第二次查询的最后两列设置null,SCO\u Credit\u allocated
将获得OrderDate
的值,这是我们不想要的。目前,所有列名都被保留。