比较相等性并计算相同字符串在返回的 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.
我正在编写一个与 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.