PHP - несколько условий в инструкции while

По какой-то причине этот код не запускается в моем компиляторе. Намерение (как часть более крупного проекта) состоит в том, чтобы пинговать конкретный хост 3 раза или до успешного завершения, в зависимости от того, что наступит раньше. Ошибок не возникает, просто завершается. Он отлично работает, если я удалю второе условие из оператора while, но тогда мне понадобится что-то более сложное, чтобы завершить цикл при успешном пинге. Я давно не касался PHP, так что, наверное, упустил какую-то глупость.

<?php
function pingAddress($ip) {
//Set variable to limit loops and end if live
$pass = 0;
$result = 0;
//Create conditions for while loop
while( ( $pass < 3 ) && ( $result = 0 ) ) {
    //Count loops
    $pass++;
    //Execute ping
    $output=shell_exec('ping -n 1 '.$ip);
    //Display ping results for testing purposes
    echo "<pre>$output</pre>";
    //Check for "TTL" presence
    if (strpos($output, 'TTL') !== false)
    {
        //Notate positive result
        $result++;
        //Display for testing
        echo "Alive";
    }
    //Display negative result for testing
    else
    {
        echo "Dead";
    }
}
}


PingAddress("8.8.8.8");

Нужен двойной == в $result = 0, это просто присвоение 0 результату $, а не его тестирование.

Nigel Ren 13.07.2018 17:31

Возможный дубликат 3 разных равных

Patrick Q 13.07.2018 17:34

Вы можете использовать en.wikipedia.org/wiki/Yoda_conditions, чтобы избежать этой ошибки.

A.L 13.07.2018 17:37
Стоит ли изучать 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 и хотите разрабатывать...
0
3
3 952
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

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

Вы пнете себя:

while( ( $pass < 3 ) && ( $result = 0 ) ) {

Следует использовать двойное равенство - это сравнение, а не присвоение:

while( ( $pass < 3 ) && ( $result == 0 ) ) {

Ваше второе условие написано неправильно. Меняем его на $result === 0

Использовать оператор равенства, а не назначать.

while( ( $pass < 3 ) && ( $result == 0 ) )

Это должно сработать.

Вторая переменная $result вам не нужна. Вместо этого используйте перерыв.

while($pass < 3) {
    //Count loops
    $pass++;
    //Execute ping
    $output=shell_exec('ping -n 1 '.$ip);
    //Display ping results for testing purposes
    echo "<pre>$output</pre>";
    //Check for "TTL" presence
    if (strpos($output, 'TTL') !== false)
    {
        //Display for testing
        echo "Alive";

        break; //exiting while loop
    }
    //Display negative result for testing
    else
    {
        echo "Dead";
    }
}

Вы даже можете писать меньше кода с помощью

while($pass++ < 3) {

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