2010-09-07 2 views
3

Я получаю случайные Неопределенные проблемы смещения при разборе большого файла внутри PHP.Как отображать переменные при ошибке?

Как я могу отображать переменные ТОЛЬКО при возникновении ошибки, чтобы узнать, в чем проблема?

Ошибка встречающийся в этот момент моего PHP

list($export_date, $application_id, $language_code, $title, $description, $release_notes, $company_url, $suppport_url, $screenshot_url_1, $screenshot_url_2, $screenshot_url_3, $screenshot_url_4, $screenshot_width_height_1, $screenshot_width_height_2, $screenshot_width_height_3, $screenshot_width_height_4,$ipadscreenshot_url_1, $ipadscreenshot_url_2, $ipadscreenshot_url_3, $ipadscreenshot_url_4, $ipadscreenshot_width_height_1, $ipadscreenshot_width_height_2, $ipadscreenshot_width_height_3, $ipadscreenshot_width_height_4) = explode($delimiter, $line); 

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

ответ

0

ошибка будет возникать, если explode($delimiter, $line) не возвращать столько параметров, как список операторов требуется, вы можете проверить, если это так, как это:

$parts = explode($delimiter, $line); 
if(count($parts)!=20) { //say your list needs 20 elements 
    echo '20 parts expected, got '. count($parts). '<br />';//consider using error_log than echoing data 
    var_dump($line, $parts); 
} else { 
    list($export_date, $application_id, $language_code /*fill others*/) = $parts; 
} 
+0

спасибо это, если идеально, если это ошибки это означает, что мой ввод данных коррумпирован, поэтому я хочу игнорировать его. – kitenski

0

Пробовали ли вы set_error_handler? Это позволяет вам написать функцию, которая будет выполняться при возникновении ошибки или предупреждения. Параметр errcontext содержит все переменные. Вы можете, например, зарегистрировать $line, когда это произойдет, а затем перейти к следующей строке. См. Ссылку для примеров.

0

@ Решение aularon - отличное быстрое решение, но если вы ищете долгосрочное исправление, попробуйте установить обработчик ошибок. Я предполагаю, что вы действительно не ошибаетесь, а скорее предупреждение. Вы могли бы сделать что-то вроде этого:

(см http://us2.php.net/manual/en/function.set-error-handler.php)

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

    switch ($errno) { 

    case E_USER_WARNING: 
     echo "<b>My WARNING</b> [$errno] $errstr<br />\n"; 
     vardump($symbols['line']); // untested but this should give you the line as set when the error was raised 
     break; // maybe die or exit here instead 
    } 

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

Вы можете set_error_handler() прямо перед началом цикла, то restore_error_handler() сразу после этого, так что вы не до конца с нечетким обработчиком ошибок для всего приложения или скрипта.

0

У меня есть два подхода к вам:

Первое:

Вы можете хранить эти значения во временном массиве и сосчитать предметы, если есть меньше, чем 24, что-то пошло не так!

$tmp_arr = explode($delimiter, $line); 
if(count($tmp_arr) < 24) { 
    print_r($tmp_arr); // gives you a nice output 
} 
else 
{ 
    list($export_date, $application_id, $language_code, $title, $description, $release_notes, $company_url, $suppport_url, $screenshot_url_1, $screenshot_url_2, $screenshot_url_3, $screenshot_url_4, $screenshot_width_height_1, $screenshot_width_height_2, $screenshot_width_height_3, $screenshot_width_height_4,$ipadscreenshot_url_1, $ipadscreenshot_url_2, $ipadscreenshot_url_3, $ipadscreenshot_url_4, $ipadscreenshot_width_height_1, $ipadscreenshot_width_height_2, $ipadscreenshot_width_height_3, $ipadscreenshot_width_height_4) = explode($delimiter, $tmp_arr); 
} 

Если вам не нравится временный массив, вы можете рассчитывать разделители (не так хорошо, на мой взгляд)

if(substr_count($line, $delimiter) < 23) { 
    // less than 24 fields! 
    print_r(explode($delimiter, $tmp_arr)); 
} 
else 
{ 
    // everything alright! 
    list($export_date, $application_id, $language_code, $title, $description, $release_notes, $company_url, $suppport_url, $screenshot_url_1, $screenshot_url_2, $screenshot_url_3, $screenshot_url_4, $screenshot_width_height_1, $screenshot_width_height_2, $screenshot_width_height_3, $screenshot_width_height_4,$ipadscreenshot_url_1, $ipadscreenshot_url_2, $ipadscreenshot_url_3, $ipadscreenshot_url_4, $ipadscreenshot_width_height_1, $ipadscreenshot_width_height_2, $ipadscreenshot_width_height_3, $ipadscreenshot_width_height_4) = explode($delimiter, $line); 
} 

Внимание! у вас всего 23 разделителя на 24 поля! ;)

Второй подход:

Поскольку Неопределенное Offset вопрос просто «Уведомление» из PHP можно написать обработчик ошибок, который ловит уведомление.

См: http://www.codeunit.co.za/2009/09/09/php-how-to-catch-a-script-warning-or-notice/

Но это одна, может быть, немного избыточна;)

С наилучшими пожеланиями

Simon

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