Q:

php Invalid argument supplied for foreach();

Есть скрипт, который пингует все IP адреса в столбце "ip_address". Нужно чтобы после пинга записывались результат в столбец "status". Т.е. если компьютер находится онлайн, в столбец "status" писать значение 1, а если оффлайн - 0. Пример базы: 

Вот мой скрипт:
<?php
$link = mysqli_connect("192.168.10.56", "test", "test", "test");

if (!$link) {
    echo "Error: Unable to connect to MySQL." . PHP_EOL;
    echo "Debugging errno: " . mysqli_connect_errno() . PHP_EOL;
    echo "Debugging error: " . mysqli_connect_error() . PHP_EOL;
    exit;
}

echo "Работает: Подключение с базой данных имеется!" . PHP_EOL;
echo "Информация о хосте: " . mysqli_get_host_info($link) . PHP_EOL;

foreach($devices as $value){
    exec("ping -c 1 " . $value->ip_address, $output, $result);
    if ($result == 0) {
        $insert_sql = mysqli_query($link, "UPDATE 'test' SET 'status'='1' WHERE ip_addres = '".$value->ip_address."'");
     }else{ 
        $insert_sql = mysqli_query($link, "UPDATE 'test' SET 'status'='0' WHERE ip_addres = '".$value->ip_address."'");
}
    }

mysqli_close($link);
?>

Меня удивляет то, что, когда я запускаю скрипт в самом сервере, он не показывает никаких ошибок, но и не пишет в столбец. Но когда запускаю его на виртуальном сервере, то вот что:

A:

Вообще-то правильно он все пишет.
Invalid argument supplied for foreach() - он ссылается на строку foreach($devices as $value). Судя по коду, переменная $devices нигде не создается, вот он ее и не видит.
Предположим, что $devices это массив с IP адресами.
В таком случае Ваш код будет выглядить вот так:  
// берем из таблицы список ip адресов (тут можно и WHERE добавить)
$result = mysqli_query($link, "SELECT ip_address FROM devices");
if ($result) { // если список есть
    $ok = $bad = Array(); // в этих массивах будем хранить списки адресов после проверки
    while ($row = mysql_fetch_assoc($result)) { // прокручиваемся через него по одному
        exec("ping -c 1 " . $row["ip_address"], $output, $result); // пингуем адрес
        if ($result == 0) { // в зависимости от результатов пинга заносим адрес в массив
            $ok[] = $row["ip_address"];
        } else { 
            $bad[] = $row["ip_address"];
        }
    }
    // если есть OK адреса - обновлем все сразу одним запросом
    if (Count($ok)) {
        mysqli_query($link, "UPDATE test SET `status`=1 WHERE `ip_address` IN ('".implode("', '", $ok)."')");
    }
    // если есть BAD адреса - обновлем все сразу одним запросом
    if (Count($bad)) {
        mysqli_query($link, "UPDATE test SET `status`=0 WHERE `ip_address` IN ('".implode("', '", $bad)."')");
    }
}

А если Вас удивляет то, что ошибки показываются на одном сервере и не показываются на другом, так это вполне могут быть просто настройки. Отключено показывание сообщений об ошибках.
Поставьте вот это
error_reporting(E_ALL & ~E_NOTICE);
ini_set('display_errors', '1');

в первых строчках кода. И тогда ошибки будут отображаться везде.

