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



我是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。

相关内容

  • 没有找到相关文章

最新更新