За последние 24 часа нас посетили 20882 программиста и 1616 роботов. Сейчас ищут 1114 программистов ...

Система ошибок и уведомлений

Тема в разделе "PHP для новичков", создана пользователем SamyRed, 18 май 2017.

  1. SamyRed

    SamyRed Старожил

    С нами с:
    23 июл 2015
    Сообщения:
    1.196
    Симпатии:
    111
    Адрес:
    Украина
    Здравствуйте. Подскажите, пожалуйста, ссылку на статью, или объясните сами, как лучше организовать систему вывода ошибок, и разнообразной информации на сайте, например, при регистрации ввожу неправильный логин, страница перезагружается и мне красиво так пишет что мой логин некорректный, но меня не устраивает вариант на каждой странице описывать какие могут быть ошибки и что делать когда такие ошибки появляются. У меня была идея сделать на основе сессии, или кукисов так, чтобы когда выполняется условный оператор, в сессию пишется переменная с ошибкой, или какой-то информацией, и происходит перенаправление, а в единой точке входа выполняется обработка такой сессии, и вывод. Подскажите как правильно построить такую архитектуру, или подскажите другой вариант, пожалуйста.
    --- Добавлено ---
    З.Ы. Хочется сделать некую универсальную систему, чтобы когда нужно вывести какое либо оповещение - можно было просто написать конструкцию типа:
    PHP:
    1. addMessage ('error', '<b>Ошибка!</b> Всё плохо.')
     
  2. Алекс8

    Алекс8 Активный пользователь

    С нами с:
    18 май 2017
    Сообщения:
    1.730
    Симпатии:
    359
    я делал так)) меня правда сейчас тапками закидают за global но можно и без него обойтись)

    1. Открывается Ваша страница регистрации.
    2. Вводите параметры нажимаете субмит и отправляете POST запрос
    3. Скрипт принимает запрос
    4. Объявляется массив к примеру $error = array();
    5. Начинаем проверку переданных параметров в POST запросе
    6. Если к примеру указали неправильный логин то заполняем массив $error[] = 'login';
    7. Проверили все параметры.
    8. Дальше проверяем
    Код (Text):
    1. if(empty($error))
    если массив пуст (ошибок нет) то обрабатываем полученные данные так как нам надо
    если массив не пуст - то снова открываем страницу с логином из нашего массива $_POST заполняем ранее введенные данны (почта, логин и т.п.)
    а вверху страницы где то между хидером и контентом запускам что то типа такого
    Код (Text):
    1. echo '<ul>';
    2. foreach($error AS $t){
    3. echo '<li>' . $errors_txt [$t] . '</li>';
    4. }
    5. echo '</ul>'
    где $errors_txt это у нас массив с текстовыми значениями которые описывают ошибки...
    к примеру
    Код (Text):
    1. $errors_txt ['login'] = 'Неверный логин';
    коды ошибок лучше описать в языковых файлах проекта.. или где то в базе а потом вытягивать их.. таким образом получается что у Вам в шаблоне будет один обработчик всех ошибок.. только будут подствляться нужные ключи..
    а массив $error в скрипте будет как бы индикатором наличия ошибок ввода данных пользователем)
     
    SamyRed нравится это.
  3. SamyRed

    SamyRed Старожил

    С нами с:
    23 июл 2015
    Сообщения:
    1.196
    Симпатии:
    111
    Адрес:
    Украина
    Я указал что такой вариант меня не устраивает. Так я и сам могу сделать. Мне нужно сделать так, чтоб скрипт, видя что срабатывает условный оператор - делал так, что на следующей странице появится нужное уведомление, либо ошибка, при чём, если ошибка не одна, то должны отобразиться обе. А обработки ошибок должны происходить автоматически не смотря на то, с какой ошибкой и с какой страницы я пришёл.
     
  4. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.596
    Симпатии:
    1.764
    Напиши, в чём проблема? Или поищи на гите. Я пользуюсь теми, что в фреймворках
     
  5. SamyRed

    SamyRed Старожил

    С нами с:
    23 июл 2015
    Сообщения:
    1.196
    Симпатии:
    111
    Адрес:
    Украина
    Так же есть 1 минус: Если происходит ошибка, которая не зависит от пользователя (Например, $_GET запрос какой-то неправильный), то будет происходить куча редиректов
    --- Добавлено ---
    Сам их от туда выпиливаешь?)))
     
  6. Алекс8

    Алекс8 Активный пользователь

    С нами с:
    18 май 2017
    Сообщения:
    1.730
    Симпатии:
    359
    может я Вас не так понял)
    еще раз перечитал Ваш вопрос)) вот в моем случае так и есть.. стоит в в нижней части хидера одна функция которая принимает массив.. хидер на всех страницах одинаковый... если в функцию передается массив с ошибками - то они выводятся..
    никаких уникальных условий в этой функции нет.. на каждой странице все одинаково.. а вот разные страницы генерят свой массив с ошибками и передают))
     
  7. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.809
    Симпатии:
    1.332
    Адрес:
    Лень
    http://blog-price.com/userb.php
    хрень в полях набери мыло(не мыло) урл (фывфыафывафафыва например)
    --- Добавлено ---
    Код (Javascript):
    1. $( 'body' ).on( 'submit', 'form#CHANNEL_NEW', function ( e )
    2.     {
    3.         e.preventDefault();
    4.      
    5.         $( '#GLOBAL_CIRCLE' ).css( {'opacity':'', 'display':'block'} );
    6.         $( '#CHANNEL_NEW > div > p' ).removeAttr( 'style' ).css( {'display':'none'} ).html();
    7.      
    8.         var form = $( this );
    9.         var formData = new FormData( form.get(0) );
    10.      
    11.         $.ajax(
    12.         {
    13.             url: form.attr( 'action' ),
    14.             type: form.attr( 'method' ),
    15.             contentType: false, // важно - убираем форматирование данных по умолчанию
    16.             processData: false, // важно - убираем преобразование строк по умолчанию
    17.             data: formData,
    18.             dataType: 'JSON',
    19.             success: function( json )
    20.             {
    21.                 console.log(json);
    22.                 if ( json.error !== undefined )
    23.                 {
    24.                     $.each( json.error, function( index, value )
    25.                     {
    26.                         $( 'p#err_' + index ).css( {'display':'block', 'color':'red', 'font-size':'15px'} ).html( value );
    27.                     });
    28.                  
    29.                     setTimeout( function()
    30.                     {
    31.                         $( '#GLOBAL_CIRCLE' ).animate( {opacity: '0'}, 500 );
    32.                      
    33.                         setTimeout( function()
    34.                         {
    35.                             $( '#GLOBAL_CIRCLE' ).css( {'display':'none'} );
    36.                         }, 500 );
    37.                     }, 1000 );
    38.                 }
    39.                 if ( json.good !== undefined )
    40.                 {
    41.                     $( '#GLOBAL_CIRCLE' ).css( {'opacity':'', 'display':'block'} );
    42.                  
    43.                     $( '#LOADING' ).html( json.good );
    44.                  
    45.                     setTimeout( function()
    46.                     {
    47.                         document.location.href = '/userb.php';
    48.                     }, 5500 );
    49.                 }
    50.             }
    51.         });
    52.     });
    Код (Text):
    1. {"error":{
    2. "email":"Введен не правильный Email",
    3. "channel":"Проверьте корректность введенного канала.",
    4. "msgpost":"Это поле так же не должно оставаться без внимания! =)"
    5. }}
     
    #7 MouseZver, 18 май 2017
    Последнее редактирование: 18 май 2017
  8. SamyRed

    SamyRed Старожил

    С нами с:
    23 июл 2015
    Сообщения:
    1.196
    Симпатии:
    111
    Адрес:
    Украина
    Всё, тупонул. Это я не так понял. Я, по сути, так и делаю, но постоянно сталкиваюсь с какими-то проблемами. Например, в начале индекса у меня подключён файл соединения с БД, а нём создаётся ошибка (Когда соединение "неправильное"), и по логике вещей, эта ошибка должна вывестись на экран, потому что я проверяю наличие массива $_SESSION['alerts']['e'], и если он не пустой - вывожу уведомления. следующее, и в итоге -
    Код (Text):
    1.  
    2. Fatal error: Uncaught Error: Call to a member function query() on null in /.../service/functions.php:33 Stack trace: #0 /.../service/crone.php(5): user() #1 /.../index.php(11): require_once('...') #2 {main} thrown in /.../service/functions.php on line 33
     
  9. Алекс8

    Алекс8 Активный пользователь

    С нами с:
    18 май 2017
    Сообщения:
    1.730
    Симпатии:
    359
    я бы если есть проблемы с подключением к БД дальше бы ничего не делал.. в документации пхп есть такой пример)) у меня так приблизительно и реализовано))
    Код (Text):
    1. $link = mysqli_connect("127.0.0.1", "my_user", "my_password", "my_db");
    2.  
    3. if (!$link) {
    4.     echo "Ошибка: Невозможно установить соединение с MySQL." . PHP_EOL;
    5.     echo "Код ошибки errno: " . mysqli_connect_errno() . PHP_EOL;
    6.     echo "Текст ошибки error: " . mysqli_connect_error() . PHP_EOL;
    7.     exit;
    8. }
    то есть если нет подключения к базе просто выводим строку ошибки и прекращаем работу скрипта) если нет базы - смысл что то грузить дальше)
     
  10. SamyRed

    SamyRed Старожил

    С нами с:
    23 июл 2015
    Сообщения:
    1.196
    Симпатии:
    111
    Адрес:
    Украина
    Я тоже об этом думал, но нельзя ли сделать так, чтоб страница грузилась без данных из БД, то есть чтоб грузилась сама структура (Шапка, маин блок, а котором, собственно, сами оповещения, футер, и т.д.)?
     
  11. Алекс8

    Алекс8 Активный пользователь

    С нами с:
    18 май 2017
    Сообщения:
    1.730
    Симпатии:
    359
    проблема в том что в большинстве проектов тот же хидер динамический, что бы он загрузился нужно получить из БД какие то даные.. имя страницы, какой то текст или еще что то.. как вариант сделать статический шаблон который выглядит как динамический шаблон скрипта и вызывать его)) но это дублирование - а это не очень кошерно)
     
  12. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.809
    Симпатии:
    1.332
    Адрес:
    Лень
    Если это позволяет скелет структуры твоего кода - безоговорочно ДА, можно.
     
  13. SamyRed

    SamyRed Старожил

    С нами с:
    23 июл 2015
    Сообщения:
    1.196
    Симпатии:
    111
    Адрес:
    Украина
    Ладно, не буду, короче, выпендриваться, и выведу при ошибке БД обычную чёрно-белую ошибку. Всё равно смысла нет страницу грузить когда БД не грузится.
    --- Добавлено ---
    Ок. Как быть с редиректами, когда нужно загрузить ту же страницу, с теми же гет параметрами, но ошибка связана с каким-то параметром? Тогда при обработке ошибки скрипт перенаправляет браузер по тому же адресу, и так до посинения.
     
  14. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.809
    Симпатии:
    1.332
    Адрес:
    Лень
    А зачем делать цикл ? должен понимать
    PHP:
    1. <?php
    2.  
    3. if ( isset( $_GET['error'] ) )
    4. {
    5. header ( 'Location: /?error' );
    6. }
     
  15. Алекс8

    Алекс8 Активный пользователь

    С нами с:
    18 май 2017
    Сообщения:
    1.730
    Симпатии:
    359
    не совсем понял проблему... но вот к примеру... страница где нужно вводить какие то данные, ИМЯ ФАМИЛИЮ ОТЧЕСТВО ПОЛ... это дочерняя страница к примеру списка учащихся в школе.
    если данные ввели правильно - то после добавления данных в БД нас редиректит на список учащихся ..
    если данные ввели не правильно то мы остается на странице ввода данных и видим уведомления про ошибку без всяких редиректов..
    --- Добавлено ---
    если Вы про мой ответ - то ошибок может быть несколько и их нужно вывести под хидером что бы пользователь видел в чем он накосячил)
    --- Добавлено ---
    Вот на скрине пример того как это у меня выглядит))
    2017-05-18_23-02-49.png
     
  16. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.809
    Симпатии:
    1.332
    Адрес:
    Лень
  17. SamyRed

    SamyRed Старожил

    С нами с:
    23 июл 2015
    Сообщения:
    1.196
    Симпатии:
    111
    Адрес:
    Украина
    Иногда прходится делать так что добавление ошибки происходит после вывода ошибок. Для этого используются редиректы. Получается что я вижу что какой-то параметр неправильный, создаю метку с ошибкой, дохожу до конца, проверяю, есть ли ошибки, если есть - редирект на эту же страницу. И всё сначала. Я то могу редиректиться на другую страницу, но нужно же остаться на этой же, да при том что все остальные get параметры должны остаться.
     
  18. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.809
    Симпатии:
    1.332
    Адрес:
    Лень
    добавь флаг к урл при переправке /?error&...

    PHP:
    1. <?php
    2.  
    3. if ( isset ( $_GET[...], $_GET[...] ) && !isset ( $_GET['error'] ) )
    4. { код выполнения }
    5. else
    6. { форма +
    7. ( isset ( $_GET['error'], $_GET['a'] ) ? lol : '' )
    8. ...
    9. ( isset ( $_GET['error'], $_GET['e'] ) ? lol : '' )
    10. }
     
    SamyRed нравится это.
  19. SamyRed

    SamyRed Старожил

    С нами с:
    23 июл 2015
    Сообщения:
    1.196
    Симпатии:
    111
    Адрес:
    Украина
    Ок. Завтра попробую, а щас - спать. Всем спасибо за помощь!
     
  20. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    система из девяностых
     
  21. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.809
    Симпатии:
    1.332
    Адрес:
    Лень
    есть такое. когда не хотим AJAX + JSON
     
  22. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
    Нет. По логике вещей эта ошибка должна уйти в лог, а пользователю отдана страница с кодом 500.
     
    Fell-x27 нравится это.
  23. SamyRed

    SamyRed Старожил

    С нами с:
    23 июл 2015
    Сообщения:
    1.196
    Симпатии:
    111
    Адрес:
    Украина
    Кто сказал что не хотим? Очень даже хотим. Но, ладно, тема закрыра, я, в принципе, понял что хотел.
     
  24. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    И надписью, что "Пожалуйста, повторите попытку позже, проблема скоро будет исправлена", или типа того. Чтобы он понял, что сайт, в общем-то работает и поддерживается, но не в данную секунду.

    А еще можно сделать так, чтобы тебе на почту письма шли, если ошибка возникает. Главное - сделать фильтр, чтобы одна и та же ошибка не вызывала мириады писем. Это настраивается на уровне сервера, к слову. Костылить не надо. И можно по крону проверять изменения в логах, после чего отправлять письмо.
     
    romach нравится это.