#php #for-loop
#php #for-loop
Вопрос:
в моем текущем проекте я хочу разделить 10 пользователей из очереди на 2 команды по 5 пользователей в каждой.
Когда 10 пользователей находятся в очереди, выполняется функция create_new_lobby() . В этой функции создается матч, и все пользователи должны быть распределены по командам в промежуточной таблице. С помощью цикла for все пользователи должны быть назначены на совпадение. В настоящее время цикл for принимает только каждого второго пользователя (0, 2, 4, 6, 8). Значения 1, 3, 5, 7 и 9, по-видимому, пропускаются циклом for.
Где здесь ошибка?
<?php
function create_new_lobby() {
global $connection;
$timestamp = date("Y-m-d H:i:s", strtotime(date('h:i:sa')));
$stmt = $connection->prepare("INSERT INTO competition_game (create_time) VALUES (?)");
$stmt->bind_param("s", $timestamp);
$stmt->execute();
$stmt->close();
$stmt = $connection->prepare("SELECT competition_match_id FROM competition_game ORDER BY competition_match_id DESC LIMIT 0, 1");
$stmt->execute();
$result = $stmt->get_result();
$row = $result->fetch_assoc();
$competition_match_id = $row['competition_match_id'];
$stmt->close();
for($player = 0; $player <= 9; $player ) {
$status_queue = 1;
$stmt = $connection->prepare("SELECT * FROM competition_queue WHERE competition_queue_status = ? AND DATE_ADD(competition_queue_activity ,INTERVAL 20 MINUTE) >= NOW() ORDER BY competition_queue_id ASC LIMIT ?, 1");
$stmt->bind_param("ss", $status_queue, $player);
$stmt->execute();
$result = $stmt->get_result();
while($row = $result->fetch_assoc()) {
$user_id = $row['user_id'];
$stmt1 = $connection->prepare("INSERT INTO competition_game_player (competition_match_id, user_id) VALUES (?, ?)");
$stmt1->bind_param("ss", $competition_match_id, $user_id);
$stmt1->execute();
$stmt1->close();
}
$stmt->close();
$status_leave = 2;
$stmt = $connection->prepare("UPDATE competition_queue SET competition_queue_status = ? WHERE user_id = ? AND competition_queue_status = ?");
$stmt->bind_param("sss", $status_leave, $user_id, $status_queue);
$stmt->execute();
$stmt->close();
}
}
?>
Комментарии:
1. Проблема в том, что вы
SELECT * FROM competition_queue
используетеLIMIT
для извлечения определенной записи внутри цикла, обрабатываете эту запись, а затем в конце того же цикла выUPDATE competition_queue
— что эффективно удаляет запись из очереди. Таким образом, теперь у вас на 1 запись меньше в очереди, но вы все равно увеличиваете$player
Ответ №1:
Цикл for работает так, как должен, и вы можете проверить это, поместив var_dump($payer)
внутри цикла for;
Приращение в цикле for задается третьим оператором, the $player
, что означает $player = $player 1;
Если вы хотите использовать другой шаг цикла, вы можете добавить другое выражение для третьего оператора в цикле for.
например ,
for($player = 0; $player <= 9; $player ) {
var_dump($player);
}
exit;
Фрагмент кода будет выводить 0 1 2 3 4 5 6 7 8 9
for($player = 0; $player <= 9; $player = 2) {
var_dump($player);
}
exit;
Фрагмент кода выведет 0 2 4 6 8
Я надеюсь, что это помогло вам лучше понять цикл for.
Фактическая проблема, с которой вы сталкиваетесь, создается логикой, которую вы создали с помощью SQL, а не циклом for