Показать ошибки перед перенаправлением - PullRequest
1 голос
/ 26 июля 2010

Когда я делаю перенаправление, ошибки не отображаются.Я использую codeigniter Framework и в моем файле index.php есть

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

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

Функция перенаправления - это простой заголовок:

header('Location: ' . $uri);

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

Спасибо.

Ответы [ 3 ]

1 голос
/ 26 июля 2010

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

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

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

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

Вариант 1 Покажите ошибку и не делайте никакого перенаправления вообще. Если это так, просто удалите функцию перенаправления из вашего обработчика ошибок.

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

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

Через 5 секунд браузер будет перенаправлен в другое место.

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

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

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

1 голос
/ 26 июля 2010

Я использую подход, использующий пользовательский обработчик ошибок, который генерирует исключения для любой ошибки; это гарантирует, что я ничего не пропущу во время разработки. Возникновение исключения приведет к немедленному прерыванию работы вашего кода, что позволит избежать перенаправления. Для производственных сайтов я отключаю это (и также отключаю 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 голосов
/ 25 августа 2011

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

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

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

  flush();
}
set_error_handler('my_error_handler');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...