Получение неопределенного смещения при попытке обновить ранжированный php cron - PullRequest
0 голосов
/ 07 ноября 2019

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

Мне нужна помощь, чтобы выяснить, что не так с последней частью кода (или более, если применимо) и как ее исправить.

Я потратил несколько часов, пытаясьСам исправляю код, в том числе онлайн-исследования стеков, а также играю с кодом. Я новичок в PHP и пытаюсь выяснить, что я делаю неправильно.

<?php
include("config.php");
connect();

// Update rankings every 5 mins.

$get_gold = mysqli_query($mysqli,"SELECT `id`,`gold` FROM `stats` ORDER BY `gold` DESC") or die(mysqli_error($mysqli));
$i = 1;
$rank = array();
while($gold = mysqli_fetch_assoc($get_gold)){
    $rank[$gold['id']] = $gold['gold'];
    mysqli_query($mysqli,"UPDATE `ranking` SET `gold`='".$i."' WHERE `id`='".$gold['id']."'") or die(mysqli_error($mysqli));
    $i++;
}

$get_food = mysqli_query($mysqli,"SELECT `id`,`food` FROM `stats` ORDER BY `food` DESC") or die(mysqli_error($mysqli));
$i = 1;
$rank = array();
while($food = mysqli_fetch_assoc($get_food)){
    $rank[$food['id']] += $food['food'];
    mysqli_query($mysqli,"UPDATE `ranking` SET `food`='".$i."' WHERE `id`='".$food['id']."'") or die(mysqli_error($mysqli));
    $i++;
}

$get_warrior = mysqli_query($mysqli,"SELECT `id`,`warrior` FROM `unit` ORDER BY `warrior` DESC") or die(mysqli_error($mysqli));
$i = 1;
$rank = array();
while($warrior = mysqli_fetch_assoc($get_warrior)){
    $rank[$warrior['id']] += ($warrior['warrior'] * 10);
    mysqli_query($mysqli,"UPDATE `ranking` SET `warrior`='".$i."' WHERE `id`='".$warrior['id']."'") or die(mysqli_error($mysqli));
    $i++;
}

$get_defender = mysqli_query($mysqli,"SELECT `id`,`defender` FROM `unit` ORDER BY `defender` DESC") or die(mysqli_error($mysqli));
$i = 1;
$rank = array();
while($defender = mysqli_fetch_assoc($get_defender)){
    $rank[$defender['id']] += ($defender['defender'] * 10);
    mysqli_query($mysqli,"UPDATE `ranking` SET `defender`='".$i."' WHERE `id`='".$defender['id']."'") or die(mysqli_error($mysqli));
    $i++;
}

asort($rank);
$rank2 = array_reverse($rank,true);
$i = 1;
foreach($rank2 as $key => $val){
    mysqli_query($mysqli,"UPDATE `ranking` SET `overall`='".$i."' WHERE `id`='".$key."'") or die(mysqli_error($mysqli));
    $i++;
    }

?>

При выполнении кода я получаю следующие уведомления PHP:

Уведомление PHP:Неопределенное смещение: 9 в /var/www/vhosts/videogamesnews.co.uk/httpdocs/cron_rankings.php в строке 20

Я получаю по одной строке уведомления php для каждого игрока в игре (ранжируется9 в этом примере) в разделах 2, 3 и 4 кода (указывая на строки 20, 29 и 38).

Ожидаемый результат этого кода - использование разделов 1 - 4 для индивидуального ранжирования игроков в зависимости от их игрового положения, что в настоящее время работает нормально и обновляет базу данных, как и ожидалось. В последнем разделе, который обновляется в целом, следует затем снова оценивать тех же игроков, но на основе результатов предыдущих 4 рангов. На данный момент этого не происходит, и вместо этого он обновляет «общий» на основе четвертого раздела кода - «защитник».

1 Ответ

0 голосов
/ 07 ноября 2019

Благодаря Barmar и небольшим пробам и ошибкам я, кажется, исправил код, чтобы получить результаты, которые я искал, без каких-либо ошибок. Это была перестройка последнего раздела, а также удаление некоторых повторяющихся массивов, но теперь все работает как запланировано. Если есть какие-либо способы очистки кода или улучшения, пожалуйста, не стесняйтесь оставлять комментарии.

<?php
include("config.php");
connect();

// Update rankings every 5 mins.

$get_gold = mysqli_query($mysqli,"SELECT `id`,`gold` FROM `stats` ORDER BY `gold` DESC") or die(mysqli_error($mysqli));
$i = 1;
$rank = array();
while($gold = mysqli_fetch_assoc($get_gold)){
    $rank[$gold['id']] = $gold['gold'];
    mysqli_query($mysqli,"UPDATE `ranking` SET `gold`='".$i."' WHERE `id`='".$gold['id']."'") or die(mysqli_error($mysqli));
    $i++;
}

$get_food = mysqli_query($mysqli,"SELECT `id`,`food` FROM `stats` ORDER BY `food` DESC") or die(mysqli_error($mysqli));
$i = 1;
while($food = mysqli_fetch_assoc($get_food)){
    $rank[$food['id']] += $food['food'];
    mysqli_query($mysqli,"UPDATE `ranking` SET `food`='".$i."' WHERE `id`='".$food['id']."'") or die(mysqli_error($mysqli));
    $i++;
}

$get_warrior = mysqli_query($mysqli,"SELECT `id`,`warrior` FROM `unit` ORDER BY `warrior` DESC") or die(mysqli_error($mysqli));
$i = 1;
while($warrior = mysqli_fetch_assoc($get_warrior)){
    $rank[$warrior['id']] += ($warrior['warrior'] * 10);
    mysqli_query($mysqli,"UPDATE `ranking` SET `warrior`='".$i."' WHERE `id`='".$warrior['id']."'") or die(mysqli_error($mysqli));
    $i++;
}

$get_defender = mysqli_query($mysqli,"SELECT `id`,`defender` FROM `unit` ORDER BY `defender` DESC") or die(mysqli_error($mysqli));
$i = 1;
while($defender = mysqli_fetch_assoc($get_defender)){
    $rank[$defender['id']] += ($defender['defender'] * 10);
    mysqli_query($mysqli,"UPDATE `ranking` SET `defender`='".$i."' WHERE `id`='".$defender['id']."'") or die(mysqli_error($mysqli));
    $i++;
}

$get_overall = mysqli_query($mysqli,"SELECT `id`,`gold`,`food`,`warrior`,`defender` FROM `ranking` ORDER BY `defender` DESC") or die(mysqli_error($mysqli));
$i = 1;
while($overall = mysqli_fetch_assoc($get_overall)){
    foreach($overall as $key => $val){
    mysqli_query($mysqli,"UPDATE `ranking` SET `overall`='".$i."' WHERE `id`='".$key."'") or die(mysqli_error($mysqli));
    $i++;
    }
}   
?>
...