Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 表示同一类别中的唯一项_Php_Mysql - Fatal编程技术网

Php 表示同一类别中的唯一项

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

我正在尝试创建一个页面,在其中我从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`
要在页面上显示这些项目,我需要按“服务器类型”对每个项目进行分组。但是,在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}"