2010-07-26 2 views
1

Когда я делаю перенаправление, ошибок не отображается. я использую рамки CodeIgniter и естьПоказать ошибки перед перенаправлением

error_reporting(E_ALL); 
ini_set('display_errors', 1); 

в моем файле index.php. Когда что-то ломается в моем коде (например, ошибка «неопределенного индекса»), и я делаю перенаправление на другую страницу - ошибка не отображается. Как этого избежать - нарушить перенаправление и показать ошибки?

функция редирект только простой заголовок:

header('Location: ' . $uri); 

Я предполагаю, что это что-то связано с выходными буферами. Я попытался включить буфер (в index.php), используя ob_start(), но ничего не происходит.

Спасибо.

+0

У меня та же проблема. Раньше я получал предупреждение «заголовки уже отправил», помимо самих ошибок, что было хорошо. – scribu

ответ

1

Подход, который я использую для использования специального обработчика ошибок, который генерирует исключения при любой ошибке; это гарантирует, что я ничего не пропущу во время разработки. Выброс исключения приведет к немедленному прерыванию вашего кода, поэтому избегая перенаправления. Для производственных площадок я отключил это (а также отключил display_errors, конечно). Я включил простой код, чтобы сделать это ниже.

/** 
* Function to throw exceptions on any errors. 
*/ 
function exception_error_handler($errno, $errstr, $errfile, $errline) { 
    // Ignore suppressed errors 
    if (error_reporting() == 0) { 
     return; 
    } 
    throw new ErrorException($errstr, 0, $errno, $errfile, $errline); 
} 

// Report ALL errors 
error_reporting(E_ALL | E_STRICT | E_NOTICE); 
// Enable error display 
ini_set('display_errors', 1); 
// Set the error handler 
set_error_handler('exception_error_handler'); 

Обратите внимание, что это должно быть сделано как можно раньше при выполнении вашего скрипта, чтобы уловить все ошибки. Обратите также внимание на то, что вызов error_reporting() может вызвать слишком много ошибок для вашего удобства; мы разрабатываем очень строгий стандарт, и я считаю, что исключение исключений даже для ошибок типа E_NOTICE избавляет меня от боли, но это зависит от вас.

+0

Спасибо, но это не сработает для меня :( exception_error_handler() даже не требует для меня (я попытался умереть() в начале его). Как я упомянул в вопросе - я не см. ошибки «уведомления» ... // ps Я пробовал какой-то код, и кажется, что он не показывает даже предупреждающие сообщения. – DCrystal

+1

Codeigniter может установить собственный обработчик ошибок - см. это для получения дополнительной информации - http: // codeigniter.com/user_guide/general/errors.html –

+0

Еще раз спасибо, я только что забыл об этом ... – DCrystal

1

В вашем файле application/config/config.php вам необходимо установить уровень сообщений об ошибках, чтобы уловить ошибки php.

Как только эта опция включена, все ошибки php должны регистрироваться в папке system/logs.

Поскольку функция переадресации использует перенаправление заголовка, в браузер не отправляется контент (даже ошибки), в противном случае ваша переадресация перестанет работать.

Edit: Насколько я могу видеть, что вы хотите сделать 1 из 3 вещей:

Вариант 1 Отобразите ошибки и не делать какой-либо редирект на всех. Если это так, просто удалите функцию перенаправления из обработчика ошибок.

Вариант 2 Отображение ошибки, но перенаправление через определенный промежуток времени. Если это так, глядя на вашем делать другой тип заголовка перенаправления:

header("refresh:5;url=/somewhere/else"); 

Это будет после 5 секунд перенаправлять браузер на где-то/другом.

Вариант 3 Условно сделать редирект (если в разработке показать ошибку, если не при разработке, не показывает ошибку).

Чтобы сделать это, добавьте условный оператор в обработчик ошибок Ignit Code, чтобы проверить, находитесь ли вы в режиме разработки или проверьте свой ip, а затем выполните перенаправление в зависимости от них.

Это то, что вы ищете? Или это больше похоже на перенаправление, если не было ошибки php? Если да, то откуда вы вызываете функцию перенаправления?

+0

Я упомянул в вопросе, что я использую error_reporting (E_ALL) в index.php. Логгин в файлах не подходит в мой случай - потому что я хочу видеть ошибки при тестировании вещей. Основная цель - остановить перенаправление и @EI Yobo предложил использовать исключения для этого - хотя я не думаю, что это лучший способ, и я все еще уверен, что это smth с выходной буферизацией ... – DCrystal

+0

Да, я хочу сделать переадресацию, только если ошибок не было. Функция прямого вызова вызывает контроллер. На данный момент я просто добавляю условия для перенаправления функции, и если ob_get_contents() не пуст -> я не делаю перенаправление .. – DCrystal

0

По умолчанию вы получаете сообщение «Невозможно изменить информацию заголовка - уже отправленные заголовки ...». Если вы этого не понимаете, это означает, что есть специальный обработчик ошибок.

Для того, чтобы остановить переадресовывает при возникновении ошибки, либо удалить обработчик ошибок вообще, или вызовите вровень() в конце его:

function my_error_handler($errno, $errstr, $errfile, $errline) { 
    // error handling code 

    flush(); 
} 
set_error_handler('my_error_handler'); 
Смежные вопросы