Функция вывода ошибок

229
.
Вобщем решил я выложить свою суперпупер секретную функцию
Её задача уменьшить колличество кода и упростить вывод ошибок. Функция переписывалась уже раз пять и сейчас я спокойно могу утверждать, что она идеальна. Могу отметить то, что поддерживаются абсолютно все форматы URL(полный, относительный, абсолютный) как на локальной машине, так и на удаленном сервере, если не указать URL, то ошибка выведется на текущей странице.
Интеграция

В func.php вставляем следующий код:

$absolutpath = $_SERVER['PHP_SELF'] . '?' . $_SERVER['QUERY_STRING'];           // Абсолютный путь к странице

/****************************Массив ошибок****************************/
$errfile = file($home . "/error.dat");
$error = array();
for($i = 0; $i < count($errfile); $i++)
{
  list($key, $value) = explode(":", $errfile[$i]);
  $error[trim($key)] = trim($value);
}
/*********************************************************************/

/**********************Функция обработки ошибок***********************/
/*--------------------
$n -- номер ошибки
$url -- страница, на которую следует переадресовать при ошибке(начиная с корня "/")
--------------------*/
function error($n, $url = ''){
  global $home;
  global $absolutpath;
  if($url == '')
    $url = $absolutpath;
  $len = strlen($url) - 1;
  if(substr_count($url, '?') > 0)
    $end = '&error=' . $n;
  else if($url{$len} == '?')
    $end = 'error=' . $n;
  else
    $end = '?error=' . $n;
  $out = $home . $url . $end;
  if(substr($url, 0, 1) != '/')
    $out = $url . $end;
  header("Location: " . $out . "");
  die();
}
/*********************************************************************/


В head.php вставляем данный код в любом удобном для вас месте:

// Вывод ошибок
if(isset($_GET['error']))
{
  $err = trim(urlencode($_GET['error']));
  echo '<div class="err">';
  if(isset($error[$err]))
    echo 'Ошибка №' . $err . '<br/>' . $error[$err];
  else
    echo $error[1];
  echo '</div>';
}


Создаем в корне сайта файл error.dat, где прописываем номера и тексты ошибок таким образом:

1 : Ошибка номер 1
2 : Ошибка номер 2
3 : Ошибка номер 3


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

// Это только чтобы показать как пользоватся функцией, этот пример у вас может не сработать
if(1 != 1)
error('1', '../index.php');


Чтобы стилизовать вывод ошибок используйте класс .err

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

.err{
-moz-border-top-left-radius: 10px; /*Firefox*/
-webkit-border-top-left-radius: 10px; /*Chrome, Netscape*/
border-top-left-radius: 10px; /*IE, Opera*/
min-width: 200px;
position: fixed;
bottom: 0;
right: 0;
}


А если добавить данный яваскрипт код в конец страницы(нужно подключать jQuery!!!):

// Закрытие вывода ошибки
function err_close(){
  $('#err').fadeOut(1000);
  return false;
}

setTimeout('galarm_close()', 7000); // Таймаут для закрытия вывода ошибки


...то вывод ошибки автоматически будет пропадать через 7 секунд
Прикрепленные файлы:
.
Кадило крутится, лавэха мутится
Не используй count($errfile) в цикле for.
Прописывай отдельно его до цикла, а в цикл отдавай уже результат.
.
Simba (30.07.2011/09:01)
Не используй count($errfile) в цикле for.
Прописывай отдельно его до цикла, а в цикл отдавай уже результат.
Здесь нету особой разницы, поскольку вычисление условия в for проводится только один раз.
.
Кадило крутится, лавэха мутится
Z3RO (30.07.2011/09:04)
Здесь нету особой разницы, поскольку вычисление условия в for проводится только один раз.
Ошибаешься. Подсчёт функцией count() происходит при каждом повторении цикла.
.
Simba (30.07.2011/09:08)
Ошибаешься. Подсчёт функцией count() происходит при каждом повторении цикла.
Толькочто проверил. Да, согласен с тобой. Epic fail.
.
SAN
Я вот такой код использую (это только кусок и не для стандартного джона). Имхо хранить в сессии наличие ошибки лучше, чем передавать ее через get.

public function get_and_show() {
// Функция для вывода ранее установленного сообщения.
// Пример использования:
// message::get_and_show();

if (isset($_SESSION['message_text'])) {
switch ($_SESSION['message_code']) {
case 'critical_error': echo '<div class="cmese">Ошибка: "'.$_SESSION['message_text'].'"</div>'; break;
case 'error': echo '<div class="cmese">Ошибка: "'.$_SESSION['message_text'].'"</div>'; break;
case 'warning': echo '<div class="cmesw">Внимание: "'.$_SESSION['message_text'].'"</div>'; break;
case 'ok': echo '<div class="cmeso">'.$_SESSION['message_text'].'</div>'; break;
case 'simple': echo '<div class="cmess">'.$_SESSION['message_text'].'</div>'; break;
default: echo '<div class="cmess">'.$_SESSION['message_text'].'</div>'; break;
}
}
else {
return 1;
}
unset($_SESSION['message_code']);
unset($_SESSION['message_text']);
}

public function set_and_redirect($code = 'error', $text = 'Неопознанная ошибка', $link = '') {
// Функция для установки сообщения и немедленного перенаправления на заданную страницу.
// Пример использования:
// message::set_and_redirect('error', 'Вы ошиблись!', 'index.php');

$_SESSION['message_code'] = $code;
$_SESSION['message_text'] = $text;
header('location: '.$link);
exit;
}
.
SAN (30.07.2011/15:54)
Я вот такой код использую (это только кусок и не для стандартного джона). Имхо хранить в сессии наличие ошибки лучше, чем передавать ее
В какойто степени ты прав, но как быть с параноиками, которые отключают куки, ибо думают, что это может повредить их компу?
.
Z3RO, можно так же, как и Google поступает с пользователями IE6)))

А если серьезно, то не думаю, что таких пользователей много. Ведь даже авторизация на сайте работать не будет. Но если очень нужно, то тогда конечно мой способ не подойдет.
.
Z3RO
SAN (30.07.2011/19:05)
Z3RO, можно так же, как и Google поступает с пользователями IE6)))

А если серьезно, то не думаю, что таких пользователей много. Ведь даже авторизация на сайте работать не будет. Но если очень нужн
Ну вообще в интернете примерно 10% юзверей отключают яваскрипт и/или куки.
Всего: 10