我是PHP的新手,但在某个时候遇到了困难。我尝试查找解决方案,但是并没有找到我真正需要的解决方案。
我的目标是创建一个排行榜,在该排行榜中,值按降序显示,并显示排名和得分。此外,它还应该显示是否存在平局。
该数据库应如下所示:
+---------+------+----------------+-------+------+ | user_id | name | email | score | tied | +---------+------+----------------+-------+------+ | 1 | SB | sb@gmail.com | 1 | 0 | +---------+------+----------------+-------+------+ | 2 | AS | as@web.de | 2 | 0 | +---------+------+----------------+-------+------+ | 3 | BR | br@yahoo.com | 5 | 1 | +---------+------+----------------+-------+------+ | 4 | PJ | pj@gmail.com | 5 | 1 | +---------+------+----------------+-------+------+
输出的表应如下所示:
+------+-------------+-------+------+ | rank | participant | score | tied | +------+-------------+-------+------+ | 1 | BR | 5 | Yes | +------+-------------+-------+------+ | 2 | PJ | 5 | Yes | +------+-------------+-------+------+ | 3 | AS | 2 | No | +------+-------------+-------+------+ | 4 | SB | 1 | No | +------+-------------+-------+------+
我设法以正确的顺序显示了排名,参与者和分数。但是,我无法tied按照我希望的方式来使用该列。每当两行(没有)具有相同的值时,它应该更改该值。
tied
该表是通过创建<table>和,<thead>使用通常的html构造而成的,而则<tbody>是通过要求php文件动态创建表内容的方式创建的。
<table>
<thead>
<tbody>
在createTable代码中可以看到,我试图通过将当前行与上一行进行比较来解决此问题。但是,这种方法只结束了我的语法错误。我的想法是,我不能在SQL查询中使用php变量,而且我的知识还不足以自己解决问题。我也没有通过研究找到解决方案。
我对该方法的另一个担心是,它不会对照所有值来检查所有值。它仅检查一个到前一个,因此不会将第一个与第三个进行比较。
我的问题是如何用我的方法完成任务,或者如果我的方法完全错误,如何在另一条路线上寻求解决方案。
<table class="table table-hover" id="test"> <thead> <tr> <th>Rank</th> <th>Participant</th> <th>Score</th> <th>Tied</th> </tr> </thead> <tbody> <?php require("./php/createTable.php"); ?> </tbody> </table>
<?php // Connection $conn = new mysqli('localhost', 'root', '', 'ax'); if ($conn->connect_error) { die("Connection failed: " . $conn->connect_error); } // SQL Query $sql = "SELECT * FROM names ORDER BY score DESC"; $result = $conn->query("$sql"); // Initalizing of variables $count = 1; $previous = ''; while($row = mysqli_fetch_array($result)) { $current = $row['score']; $index = $result['user_id'] if ($current == $previous) { $update = "UPDATE names SET tied=0 WHERE user_id=$index"; $conn->query($update); } $previous = $current; ?> <tr> <td> <?php echo $count; $count++; ?> </td> <td><?php echo $row['name'];?></td> <td><?php echo $row['score'];?></td> <td> <?php if ($row['tied'] == 0) { echo 'No'; } else{ echo 'Yes'; } ?> </td> </tr> <?php } ?>
因此,我通过提出另一种方法独自解决了自己的问题。
首先,我删除了这一部分:
$current = $row['score']; $index = $result['user_id'] if ($current == $previous) { $update = "UPDATE names SET tied=0 WHERE user_id=$index"; $conn->query($update); } $previous = $current;
和previous变量。
previous
我的新方法将整个表保存在一个新数组中,使用该array_count_values()方法获取重复的值,使用该方法继续获取键,array_keys()并通过SQL查询更新数据库。
array_count_values()
array_keys()
这是更改部分的代码:
// SQL Query $sql = "SELECT * FROM names ORDER BY score DESC"; $result = $conn->query("$sql"); $query = "SELECT * FROM names ORDER BY score DESC"; $sol = $conn->query("$query"); // initalizing of variables $count = 1; $data = array(); // inputs table into an array while($rows = mysqli_fetch_array($sol)) { $data[$rows['user_id']] = $rows['score']; } // -- Tied Column Sort -- // counts duplicates $cnt_array = array_count_values($data); // sets true (1) or false (0) in helper-array ($dup) $dup = array(); foreach($cnt_array as $key=>$val){ if($val == 1){ $dup[$key] = 0; } else{ $dup[$key] = 1; } } // gets keys of duplicates (array_keys()) and updates database accordingly ($update query) foreach($dup as $key => $val){ if ($val == 1) { $temp = array_keys($data, $key); foreach($temp as $k => $v){ $update = "UPDATE names SET tied=1 WHERE user_id=$v"; $conn->query($update); } } else{ $temp = array_keys($data, $k); foreach($temp as $k => $v){ $update = "UPDATE names SET tied=0 WHERE user_id=$v"; $conn->query($update); } } }
谢谢大家的回答,并帮助我找到解决方案。