比较相等性并计算相同字符串在返回的 sql 查询中出现的次数

Compare equality and count how many times the same string appears in a returned sql query

我正在编写一个与 cards against humanity 类似的游戏,但我有点坚持使用 PHP 整理结果,我是 PHP 的新手,所以遇到了绊脚石。

所以我的所有游戏数据都在本地主机上的 SQL table 中,大致如下所示: 这些是 headers 列和 table:

中的输入
+------------+-----------------+------------+-----------------+
| FirebaseID |     Votes       | GameNumber |    Submission   |
+------------+-----------------+------------+-----------------+
|     id1    | Option number 6 |   Game 9   | Option number 6 |
|     id2    | Option number 6 |   Game 9   | Option number 1 |
|     id3    | Option number 6 |   Game 9   | Option number 6 |
|     id4    | Option number 1 |   Game 9   | Option number 1 |
|     id5    | Option number 6 |   Game 9   | Option number 4 |
+------------+-----------------+------------+-----------------+

其中 Votes 是他们投票选出的最佳答案,而 Submission 是他们自己对纸牌游戏的提交。我知道这些值目前意义不大,但一旦我开始工作,我将为每张卡片输入不同的值。

我的代码是这样的:

$conn = new mysqli($servername, $username, $password, $db);

// Check connection
if ($conn->connect_error) {
    die("Database connection failed: " . $conn->connect_error);
}

$q = $_GET['q'];

$sql="SELECT Votes, FirebaseID FROM cauusers WHERE GameNumber = '".$q."'";

$result = mysqli_query($conn,$sql);

$length = $result->num_rows;

if ($result->num_rows > 0) {
// output data of each row
    $myResArray = [];
    $count = 0;

    while($row = $result->fetch_assoc()) {
        $myResArray[$count] = $row["Votes"];
        $count++;
    }

    //var_dump($myResArray);
    $max = 0;
    $winner = "";
    $index = 1;
    //$length = count($myResArray) (This prints 5);

    for($i = 0; $i < $length;$i++){
        for($j = 0; $j < $length; $j++){
            if($myResArray[$i]===$myResArray[$j]){
                $max += 1;
                $winner = $myResArray[$i];

            }
        }
    }
    echo $winner  . "<br>";

    $sqlSel="SELECT FirebaseID FROM cauusers 
             WHERE GameNumber = '".$q."' AND Submission = '".$winner."'";

    $Submission = mysqli_query($conn,$sql);
    echo var_dump($Submission);

    if ($Submission->num_rows > 0) {
        while($row = $Submission->fetch_assoc()) {
            echo $row["FirebaseID"] . "<br>";
        }
    }
 } else {
     echo "0 results";
 }
 mysqli_close($conn);
 ?>

当我打印 $q 我得到:

Game 9

当我 var_dump $myResArray 我得到;

 array(5) { 
    [0] => string(15) "Option number 6"
    [1] => string(15) "Option number 6" 
    [2] => string(15) "Option number 6" 
    [3] => string(15) "Option number 1" 
    [4] => string(15) "Option number 6"
 }

所以我试图收集哪张卡获得最多的投票,然后基于此找出提交该卡 ID 的人(或人)是什么,这样我就可以用硬币奖励获奖者,以供以后使用游戏。我可以看到我正在检索我需要的数据,但似乎无法访问每个单独的字符串以相互比较。目前,如果有两个答案投票次数相同,则只返回一个答案。

它会打印正确的获胜答案,但会打印所有 5 个 Firebase ID 而不是

如有任何帮助,我们将不胜感激。

干杯

无需在 PHP 中编写此逻辑,您可以在 SQL 中完成大部分工作。以下查询将确定投票最多的内容,以及 return 匹配该投票的记录:

SELECT *
FROM   cauusers
WHERE  Votes = (
    SELECT   Votes
    FROM     cauusers 
    WHERE    GameNumber = 'Game 9'
    GROUP BY Votes
    ORDER BY COUNT(*) DESC
    LIMIT    1);

参见SQL Fiddle

将其整合到您的 PHP 中,您将得到类似这样的东西(未测试):

$sql = "SELECT *
        FROM   cauusers
        WHERE  Votes = (
            SELECT   Votes
            FROM     cauusers 
            WHERE    GameNumber = GameNumber = '$q'
            GROUP BY Votes
            ORDER BY COUNT(*) DESC
            LIMIT    1)";
$result = mysqli_query($conn, $sql);
if ($result->num_rows > 0) {
    // output winners
    $winner = "";
    while($row = $result->fetch_assoc()) {
        if ($winner=="") {
            $winner = $row['Votes'];
            echo "winner: $winner<br>";
        }
        echo $row["FirebaseID"] . "<br>";
    }
} else {
    echo "0 results";
}

有一件事你还应该改进:最好不要在 SQL 字符串中注入 $q ,当它是提供的值时当然不要用户。那么你很容易受到 SQL injection. Better is to use prepared statements and parameters.