admin

PHP比较列值并相应地编辑数据库

sql

我是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按照我希望的方式来使用该列。每当两行(没有)具有相同的值时,它应该更改该值。

该表是通过创建<table>和,<thead>使用通常的html构造而成的,而则<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
}
?>

阅读 193

收藏
2021-07-01

共1个答案

admin

因此,我通过提出另一种方法独自解决了自己的问题。

首先,我删除了这一部分:

$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);
        }
    }
}

谢谢大家的回答,并帮助我找到解决方案。

2021-07-01