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

时间:2017-09-03 00:31:44

标签: php mysql sql database compare

我是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
}
?>

3 个答案:

答案 0 :(得分:1)

我认为问题出在这里

 $index = $result['user_id'];

应该是

 $index = $row['user_id'];

更新绑定后,您应该从数据库中再次检索它

答案 1 :(得分:1)

而不是更新代码,您已经使用了类似的

$query = "select score, count(*) as c from names group by score having c > 1";

那么你将得到一个并列的分数,用这些分数更新记录并完成。确保所有行首先将tie设置为0,然后运行此解决方案

更新基于sql的更快解决方案:

首先重置数据库:

$update = "UPDATE names SET tied=0";
$conn->query($update);

现在所有记录都有一个绑定= 0的值。接下来更新所有具有平局的记录

$update = "update docs set tied = 1 where score IN (
    select score from docs
    group by score having count(*) > 1)";
$conn->query($update);

所有带领带的记录现在已经绑定= 1,因为我们选择了具有两个或更多记录的所有分数并更新了具有这些分数的所有记录。

答案 2 :(得分:0)

所以我通过提出不同的方法自己解决了我的问题。

首先,我删除了这部分:

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

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