2011-12-17 3 views
1

Иногда мои скрипты вызывают ошибку, в основном Предупреждение. У меня иногда возникает идея, почему это происходит, но я также не знаю, почему это происходит.Исправить ошибки/ошибки PHP

Теперь мой вопрос: возможно ли, если появится предупреждение, я могу видеть, что было в переменной?

«Предупреждение: неверный аргумент, предоставленный foreach() in ....";

Я получаю это сообщение, но не знаю, что было в переменной. Проблема в том, что это скрипт, работающий несколько часов, с разными данными, поэтому его трудно воспроизвести. Потому что, я не знаю, что было в переменной.

мне это нужно для всех видов предупреждений/ошибок/Уведомление/Fatal Error и т.д.

Спасибо за помощь.

P.S.

ответ

1

у вас есть целая глава в PHP посвященной ошибок: http://www.php.net/manual/en/book.errorfunc.php

От руководства PHP: http://www.php.net/manual/en/function.set-error-handler.php

function myErrorHandler($errno, $errstr, $errfile, $errline) 
{ 
    if (!(error_reporting() & $errno)) { 
     // This error code is not included in error_reporting 
     return; 
    } 

    switch ($errno) { 
    case E_USER_ERROR: 
     echo "<b>My ERROR</b> [$errno] $errstr<br />\n"; 
     echo " Fatal error on line $errline in file $errfile"; 
     echo ", PHP " . PHP_VERSION . " (" . PHP_OS . ")<br />\n"; 
     echo "Aborting...<br />\n"; 
     exit(1); 
     break; 

    case E_USER_WARNING: 
     echo "<b>My WARNING</b> [$errno] $errstr<br />\n"; 
     break; 

    case E_USER_NOTICE: 
     echo "<b>My NOTICE</b> [$errno] $errstr<br />\n"; 
     break; 

    default: 
     echo "Unknown error type: [$errno] $errstr<br />\n"; 
     break; 
    } 

    /* Don't execute PHP internal error handler */ 
    return true; 
} 
+0

Благодарю вас, я проверю это – user1015314

+0

Обработчик ошибок также может принять пятый параметр '$ errcontext', который содержит значение' $ GLOBALS' (или области функции) во время ошибки. Если ваша ошибка исходит из 'foreach ($ myArray as $ value)' then '$ errcontext ['myArray']' будет содержать ваше неприятное значение. – cmbuckley

0

Существует много предупреждений/ошибок, обычно нужно просто применять логику.

Warning: Invalid argument supplied for foreach() in .... 

Это означает, что некоторые переменный в Еогеаспе недействителен:

foreach ($array as $value) 

или

foreach ($array as $key => $value) 

Если ваш сценарий не соответствует точному синтаксису, или если $ массивы не являются фактический массив, будет вызвана ошибка.

+0

Я знаю, что проблема заключается в том, что цикл foreach работает как цикл 10000+, чем он получает не массив только var, и мне нужно выяснить, что было в цикле и выяснить, как его исправить:), но спасибо за помощь – user1015314

0

Это не легко проектировать debbuging обходного путь для использования давнего с регистрацией. В основном в этом случае вам нужно будет адаптировать конкретную foreach с:

foreach (must_be_array($var) as $whatever) ... 

Затем определяет эту функцию утверждения:

function must_be_array($var) { 
    if (is_array($var)) return $var; 

    print_r(array_slice(debug_backtrace(), 1)); 

    // return array(); // to remove now redundant warning 
} 

debug_backtrace дает дополнительную контекстную информацию (называемые функции и параметры могут быть полезны). Но он не скажет вам, что должно было быть в переменной массива. Это все равно будет пустой переменной.

+0

Благодарю вас, я проверю это – user1015314

0

Взгляните на set_error_handler() и debug_backtrace().

Кроме того, если есть определенная строка/foreach цикл, который регулярно производит эту ошибку, добавьте некоторый код, похожий на это, на строку перед этим ...

if (!is_array($shouldBeAnArry)) { 
    // log something here, including data about the variable 
    // from var_dump(), debug_backtrace() etc etc 
} else { 
    // do the loop 
} 

Это верно для всех ошибок/предупреждений и т.д. - если ошибка выскакивает, добавить некоторые проверки, чтобы противостоять причине ошибки на линии (ы) назад.

+0

спасибо, я проверю это – user1015314

Смежные вопросы