Сравните равенство и посчитайте, сколько раз одна и та же строка появляется в возвращенном SQL-запросе.

Я кодирую игру, похожую на карты против человечества, и я немного застрял при сопоставлении результатов с использованием PHP, я новичок в PHP, поэтому столкнулся с камнем преткновения.

Итак, у меня есть все мои игровые данные в таблице SQL на моем локальном хосте, и это выглядит примерно так:
Это заголовки столбцов и входные данные, как в таблице:

+------------+-----------------+------------+-----------------+
| 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 |
+------------+-----------------+------------+-----------------+

Где Голоса — это ответ, за который они голосуют, чтобы быть лучшим, а подача — это их собственная подача в карточную игру. Я знаю, что значения не имеют большого значения в данный момент, но как только я все заработаю, я введу разные значения для каждой карты.

Мой код такой:

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

Когда я печатаю $ д Я получил:

Игра 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"}

Поэтому я пытаюсь выяснить, за какую карту проголосовали больше всего, а затем на основе этого выяснить, кем является человек (или люди), предоставившие идентификаторы этих карт, чтобы я мог наградить победителей монетами для последующего использования в игре. Я вижу, что извлекаю нужные мне данные, но не могу получить доступ к каждой отдельной строке для сравнения друг с другом. В настоящий момент, если за одинаковое количество раз проголосовали два ответа, возвращается только один ответ.

Он печатает правильный выигрышный ответ, но печатает все 5 идентификаторов Firebase вместо

Любая помощь будет высоко ценится.

ура

1

Решение

Вместо того, чтобы кодировать эту логику в PHP, вы можете сделать больше всего в SQL. Следующий запрос определит, за что больше всего проголосовали, и вернет записи, которые соответствуют этому голосованию:

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, конечно, не тогда, когда это значение предоставляется пользователем. Тогда вы уязвимы для SQL-инъекция. Лучше использовать готовые заявления а также параметры.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]