Php 表示同一类别中的唯一项
我正在尝试创建一个页面,在其中我从MySQL后端显示一个清单。这是一个粗略的例子,我的表Php 表示同一类别中的唯一项,php,mysql,Php,Mysql,我正在尝试创建一个页面,在其中我从MySQL后端显示一个清单。这是一个粗略的例子,我的表 id,Server_Type,Status 1,BL460,Available 2,BL460,Available 3,BL460,Reserved 4,BL460,Reserved 5,BL460,Reserved 6,DL360,Reserved 7,DL360,Reserved 8,DL360,Reserved 9,DL580,Available 10,BL460,Available
id,Server_Type,Status
1,BL460,Available
2,BL460,Available
3,BL460,Reserved
4,BL460,Reserved
5,BL460,Reserved
6,DL360,Reserved
7,DL360,Reserved
8,DL360,Reserved
9,DL580,Available
10,BL460,Available`
要在页面上显示这些项目,我需要按“服务器类型”对每个项目进行分组。但是,在SQL查询中仅按“服务器类型”对项目进行分组是不够的,因为需要保留和表示每个项目的唯一ID
我想在网页上这样向最终用户展示选择(使用上表作为我们的数据):
BL460-金额:3
DL360-金额:0
DL580-金额:1
注意:我需要一个0“可用”金额的项目显示在页面上
对于最终用户来说,服务器的唯一id是什么并不重要-如果他/她选择2个BL460,那么在签出过程中,处于“可用”状态的任何2个BL460都需要切换到“保留”状态-无论是哪一个(我只是想按ASC顺序进行)
我一直面临的问题是如何以PHP格式显示页面。我需要一种能够将每个值作为选项显示在页面中的方法(即使是id,但它仍将隐藏在页面上,因为它对最终用途并不重要)。我尝试将其作为一个数组,但我对PHP了解不够,无法使用数组数据并在页面中正确显示它
有人知道如何做到这一点吗
编辑:让我添加更多信息-我已经完成了以下查询:
选择*,按id将(状态为'Available'时的情况,然后为1个ELSE NULL END)计数为产品组中的金额
它呈现了如下表格:
id、服务器类型、状态、金额
1,BL460,可用,1
2号,BL460,可用,1号
3,BL460,预留,0
4,BL460,预留,0
5,BL460,预留,0
6,DL360,保留,0
7,DL360,保留,0
8,DL360,保留,0
9,DL580,可用,1
10,BL460,可用,1
可以编写如下数组:$amounts=array();foreach($results as$entry){if($entry['Amount']==1){if(isset($amounts[$entry['Server\u Type']]){$amounts[$entry['Server\u Type']]]++;}否则{$amounts[$entry['Server\u Type']]]=1;}代码>
这会产生这样的结果:array(2){[“BL460”]=>int(3)[“DL580”]=>int(1)}
但这仍然不能为我提供数量为0的服务器类型(尽管我认为我可以定义另一个数组来提供所需的结果),我对PHP的了解也不够,无法以上述格式以html表示数据。我想我最大的问题是将这样的数组转换成html格式。有人知道-或者…有人知道更好的解决方案吗?您可以使用此sql来获取可用服务器的数量:
SELECT Server_Type, COUNT(*) as count FROM table Where `Status` = 'Available' GROUP BY Server_Type
但是,如果您想在php中处理它,这不会显示0个可用服务器:
首先,将上述sql命令的结果存储到$available变量中,然后使用以下命令从表中选择所有服务器类型:
SELECT Server_Type FROM table GROUP BY Server_Type
并将此结果存储到$server_types变量中,然后在php中循环:
foreach ($server_types as $type){
$converted_array = array_column($available, 'count', 'Server_Type');
echo (array_key_exists($type, $converted_array)) ? $converted_array[$type] : 0;
}
注意:$converted_array只需将[0]=>array('BL460'=>3)
转换为['BL460']=>3
从简单的查询中用php构建表单:
"SELECT id, Server_Type, Status FROM table ORDER BY Server_Type, id"
然后,在不考虑HTML布局和细节的情况下进行了过度简化:
$parsedItems = [];
foreach ($resultset as $item) {
if (!array_key_exists($item['Server_Type'], $parsedItems)) {
// initialize
$parsedItems[$item['Server_Type']] = [
"ids" => [],
"amount" => 0
];
}
if ($item['Status'] === "Available") {
$parsedItems[$item['Server_Type']]['ids'][] = $item['id'];
$parsedItems[$item['Server_Type']]['amount']++;
}
}
foreach ($parsedItems as $item => $values) {
if ($values['amount'] > 0) {
echo "<button onclick=\"reserve('".implode(",", $values['ids'])."')\">Reserve {$item}</button>";
} else {
echo "<button>{$item} out of stock!</button>";
}
}
并更新您的表:
"UPDATE table SET Status='Reserved' WHERE id={$id}"
请记住,这是一个简单的例子来说明可能的解决方案,应该使用准备好的语句,输入应该被过滤,使用CSRF保护,等等
您还应该考虑并发性,2个用户可以使用该方法保留相同的id,因此您应该在reserve.php上检查所选id是否仍然可用,并将整个内容包装在MySQL事务或类似的内容中
希望有帮助谢谢你的回答,但是“按服务器类型分组”不是从查询结果中删除了“id”列吗?你需要“id”?所以在第一个sql中添加它选择id,服务器类型,COUNT(*)作为COUNT…
,可以吗?如果没有,请解释您需要id列的位置?如果您选择了id、服务器类型
和按服务器类型分组
,则您只能获得查询中第一个服务器类型的第一个id。我需要每个服务器类型的id。我需要id的原因是,我可以为我的签出过程创建一种方法,将选项从“可用”转换为“保留”。例如,如果有3个BL460,但有人只选择了其中2个,那么我需要一种方法让签出过程将其中2个BL460从“可用”状态更改为“保留”状态。我知道的唯一方法是在我的查询中包含id列。所以我想你可以在php中处理所有这些,首先select*from table
并存储在$data变量中,然后通过foreach在php中循环如下:,这对你有帮助吗?这越来越接近我想要的了……但即使这样,我也无法传递“selected”在签出过程中,由于某些原因,id。不确定哪里出错,但当我尝试将服务器id传递到购物车上时,它只传递列表中服务器类型的第一个id,而不是每个唯一的id。这在php中看起来像是一个简单的循环
$reserve_ids = explode(",", $_POST['reserve_ids']);
// pick the first id, whatever...
$id = mysqli_real_escape_string($dbh, $reserve_ids[0]);
"UPDATE table SET Status='Reserved' WHERE id={$id}"