Возможен ли синтаксис оператора do-while внутри цикла while?

Пользователь на платформе выбирает услуги социальных сетей, а затем выбирает диапазон бюджета. Я собираю информацию и отправляю на php через сообщение ajax. Теперь, имея информацию, я пытаюсь создать для него случайный план с ценами в пределах его бюджета. Я использую do-while внутри цикла while, но он загружается вечно и не работает. Обычно, если пользователь выбирает Facebook, Twitter и YouTube с ежемесячным бюджетом в 30 долларов, приложение должно вернуть Facebook Bronze, Twitter Bronze и YouTube Bronze. Затем добавьте предоплату в размере 15 долларов и покажите общую сумму 30 долларов. Я действительно застрял, пытаясь заставить это работать.

Таблица БД выглядит примерно так

id | social   | price | level
1  | Facebook | 5     | Bronze
2  | Facebook | 7     | Silver
3  | Facebook | 9     | Gold
4  | Twitter  | 5     | Bronze
5  | Twitter  | 7     | Silver
6  | Twitter  | 9     | Gold
7  | YouTube  | 5     | Bronze
8  | YouTube  | 7     | Silver
9  | YouTube  | 9     | Gold
...

На стороне сервера

$monthlybudget = $_POST['monthlybudget'];
$mysocialmediachoice = $_POST['mysocialmediachoice'];
$upfront = 15;

$query = "SELECT * FROM `services` WHERE social IN ($mysocialmediachoice)";//yes I do know this is prone to injections this is just a demo for here NOT the actual code
$webstsm = $conn->prepare($query);
$webstsm->execute();
$result = $webstsm->get_result();

if ($monthlybudget =='30') {
    $level ='Bronze';
}
if ($monthlybudget =='200') {
    $level ='Silver';
}
if ($monthlybudget =='400') {
    $level ='Gold';
}

while ($row = $result->fetch_assoc()) {
    if (($row['level'] == $level)) {
        $subtotal +=($row['price'] + $upfront);//sum of total of array
        //var_export($row); //testing
        do {
            echo $row['social'];
        } while ($subtotal < $monthlybudget);
    }
}
$sumtotal = ($subtotal);
echo $sumtotal;//print total of recommended plan

В принципе, нет ничего плохого в do-while внутри while, однако ваш цикл do-while никогда не завершится, потому что ничто внутри цикла не изменяет значения переменных, тестируемых в условии while.

Nick 18.09.2018 02:11

@ Ник: Ага. Конечно. Я почти хочу удалить это сейчас.

Sadie 18.09.2018 02:25

Наверное, это уместно. Задайте новый вопрос, как только вы разберетесь с условиями вокруг этого цикла.

Nick 18.09.2018 02:35
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
3
56
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

У вас бесконечный цикл:

do {
    echo $row['social'];
} while($subtotal < $monthlybudget);

Это будет выполняться, пока выполняется условие. Поскольку ни $ subtotal, ни $ monthbudget не изменяются внутри цикла, после входа в цикл он никогда не выйдет.

Проблема в том, что условие do-while никогда не меняется с ИСТИНА на ЛОЖЬ. Если условие $subtotal < $monthlybudget начинается как ИСТИНА, инструкции в цикле будут выполняться бесконечно.

Другие вопросы по теме