Я кодирую игру, похожую на карты против человечества, и я немного застрял при сопоставлении результатов с использованием 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 вместо
Любая помощь будет высоко ценится.
ура
Вместо того, чтобы кодировать эту логику в 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-инъекция. Лучше использовать готовые заявления а также параметры.
Других решений пока нет …