我是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
列以我想要的方式工作。每当两个行(不)具有相同的值时,它应该更改值。
该表是通过在通常的HTML中创建<table>
和<thead>
来构建的,但是<tbody>
是通过需要动态创建表内容的PHP文件来创建的。
正如人们可以在创新代码中看到的那样,我尝试通过将当前行与上一行进行比较来解决此问题。但是,这种方法仅在我遇到语法错误时才结束。我对此的想法是,我不能在SQL查询中使用PHP变量,而且我的知识并不足够,无法自己解决问题。我也没有通过研究找到解决方案。
我对该方法的另一个问题是,它没有检查所有值与所有值。它仅检查一个与前一个检查,因此它不会将第一个与第三个比较。
我的问题将是我如何通过方法完成任务,或者如果我的方法完全错误,我如何在另一个路线上找到解决方案。
index.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>
createtable.php
<?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
}
?>
我认为问题在这里
$index = $result['user_id'];
应该是
$index = $row['user_id'];
更新绑定后,您应该从数据库再次检索
,所以我通过提出另一种方法来独自解决我的问题。
首先,我删除了这部分:
$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
变量。
我的新方法将整个表保存在新数组中,使用array_count_values()
方法获取重复值,继续使用array_keys()
方法获取键,并通过SQL查询更新数据库。
这是更改部分的代码:
// 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);
}
}
}
谢谢大家回答并帮助我找到解决方案。
而不是您使用的更新代码,使用了一些模拟
$query = "select score, count(*) as c from names group by score having c > 1";
然后,您将拥有带有平局的分数,以这些分数更新记录,然后完成。确保首先将所有行设置为0,然后运行此解决方案
更新更快的解决方案SQL:
首先重置数据库:
$update = "UPDATE names SET tied=0";
$conn->query($update);
所有记录现在都有一个绑定= 0值。下一个更新所有具有TIE的记录
$update = "update docs set tied = 1 where score IN (
select score from docs
group by score having count(*) > 1)";
$conn->query($update);
我们选择所有具有两个或多个记录的分数,并使用这些分数更新所有记录,
所有带有领带的记录都绑定了= 1。