【发布时间】:2017-09-03 00:31:43
【问题描述】:
我是 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文件来创建的。
正如在 createTable 代码中所见,我尝试通过将当前行与前一行进行比较来解决此问题。但是,这种方法只会导致我遇到语法错误。我的想法是我不能在 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
}
?>
【问题讨论】:
-
“每当两行(不)具有相同的值”?你什么意思 ?将值更改为什么?
-
警告:当使用
mysqli时,您应该使用parameterized queries 和bind_param将用户数据添加到您的查询中。 请勿使用字符串插值或连接来完成此操作,因为您创建了严重的SQL injection bug。 切勿将$_POST、$_GET或任何用户数据直接放入查询中,如果有人试图利用您的错误,这可能会非常有害。 -
@deg,是的。例如,如果 PJ 的“分数”变量更改为 8,则不存在平局。因此,
tied两个列都应该更改为“否”(或者更确切地说是 0)。 -
@tadman 感谢您的建议!待我解决当前问题后,我会修复这些错误。
-
请记住,第一次正确操作通常会在这些错误有机会发生之前解决它们。
标签: php mysql sql database compare