Здравствуйте. Подскажите, пожалуйста, ссылку на статью, или объясните сами, как лучше организовать систему вывода ошибок, и разнообразной информации на сайте, например, при регистрации ввожу неправильный логин, страница перезагружается и мне красиво так пишет что мой логин некорректный, но меня не устраивает вариант на каждой странице описывать какие могут быть ошибки и что делать когда такие ошибки появляются. У меня была идея сделать на основе сессии, или кукисов так, чтобы когда выполняется условный оператор, в сессию пишется переменная с ошибкой, или какой-то информацией, и происходит перенаправление, а в единой точке входа выполняется обработка такой сессии, и вывод. Подскажите как правильно построить такую архитектуру, или подскажите другой вариант, пожалуйста. --- Добавлено --- З.Ы. Хочется сделать некую универсальную систему, чтобы когда нужно вывести какое либо оповещение - можно было просто написать конструкцию типа: PHP: addMessage ('error', '<b>Ошибка!</b> Всё плохо.')
я делал так)) меня правда сейчас тапками закидают за global но можно и без него обойтись) 1. Открывается Ваша страница регистрации. 2. Вводите параметры нажимаете субмит и отправляете POST запрос 3. Скрипт принимает запрос 4. Объявляется массив к примеру $error = array(); 5. Начинаем проверку переданных параметров в POST запросе 6. Если к примеру указали неправильный логин то заполняем массив $error[] = 'login'; 7. Проверили все параметры. 8. Дальше проверяем Код (Text): if(empty($error)) если массив пуст (ошибок нет) то обрабатываем полученные данные так как нам надо если массив не пуст - то снова открываем страницу с логином из нашего массива $_POST заполняем ранее введенные данны (почта, логин и т.п.) а вверху страницы где то между хидером и контентом запускам что то типа такого Код (Text): echo '<ul>'; foreach($error AS $t){ echo '<li>' . $errors_txt [$t] . '</li>'; } echo '</ul>' где $errors_txt это у нас массив с текстовыми значениями которые описывают ошибки... к примеру Код (Text): $errors_txt ['login'] = 'Неверный логин'; коды ошибок лучше описать в языковых файлах проекта.. или где то в базе а потом вытягивать их.. таким образом получается что у Вам в шаблоне будет один обработчик всех ошибок.. только будут подствляться нужные ключи.. а массив $error в скрипте будет как бы индикатором наличия ошибок ввода данных пользователем)
Я указал что такой вариант меня не устраивает. Так я и сам могу сделать. Мне нужно сделать так, чтоб скрипт, видя что срабатывает условный оператор - делал так, что на следующей странице появится нужное уведомление, либо ошибка, при чём, если ошибка не одна, то должны отобразиться обе. А обработки ошибок должны происходить автоматически не смотря на то, с какой ошибкой и с какой страницы я пришёл.
Так же есть 1 минус: Если происходит ошибка, которая не зависит от пользователя (Например, $_GET запрос какой-то неправильный), то будет происходить куча редиректов --- Добавлено --- Сам их от туда выпиливаешь?)))
может я Вас не так понял) еще раз перечитал Ваш вопрос)) вот в моем случае так и есть.. стоит в в нижней части хидера одна функция которая принимает массив.. хидер на всех страницах одинаковый... если в функцию передается массив с ошибками - то они выводятся.. никаких уникальных условий в этой функции нет.. на каждой странице все одинаково.. а вот разные страницы генерят свой массив с ошибками и передают))
http://blog-price.com/userb.php хрень в полях набери мыло(не мыло) урл (фывфыафывафафыва например) --- Добавлено --- Код (Javascript): $( 'body' ).on( 'submit', 'form#CHANNEL_NEW', function ( e ) { e.preventDefault(); $( '#GLOBAL_CIRCLE' ).css( {'opacity':'', 'display':'block'} ); $( '#CHANNEL_NEW > div > p' ).removeAttr( 'style' ).css( {'display':'none'} ).html(); var form = $( this ); var formData = new FormData( form.get(0) ); $.ajax( { url: form.attr( 'action' ), type: form.attr( 'method' ), contentType: false, // важно - убираем форматирование данных по умолчанию processData: false, // важно - убираем преобразование строк по умолчанию data: formData, dataType: 'JSON', success: function( json ) { console.log(json); if ( json.error !== undefined ) { $.each( json.error, function( index, value ) { $( 'p#err_' + index ).css( {'display':'block', 'color':'red', 'font-size':'15px'} ).html( value ); }); setTimeout( function() { $( '#GLOBAL_CIRCLE' ).animate( {opacity: '0'}, 500 ); setTimeout( function() { $( '#GLOBAL_CIRCLE' ).css( {'display':'none'} ); }, 500 ); }, 1000 ); } if ( json.good !== undefined ) { $( '#GLOBAL_CIRCLE' ).css( {'opacity':'', 'display':'block'} ); $( '#LOADING' ).html( json.good ); setTimeout( function() { document.location.href = '/userb.php'; }, 5500 ); } } }); }); Код (Text): {"error":{ "email":"Введен не правильный Email", "channel":"Проверьте корректность введенного канала.", "msgpost":"Это поле так же не должно оставаться без внимания! =)" }}
Всё, тупонул. Это я не так понял. Я, по сути, так и делаю, но постоянно сталкиваюсь с какими-то проблемами. Например, в начале индекса у меня подключён файл соединения с БД, а нём создаётся ошибка (Когда соединение "неправильное"), и по логике вещей, эта ошибка должна вывестись на экран, потому что я проверяю наличие массива $_SESSION['alerts']['e'], и если он не пустой - вывожу уведомления. следующее, и в итоге - Код (Text): 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
я бы если есть проблемы с подключением к БД дальше бы ничего не делал.. в документации пхп есть такой пример)) у меня так приблизительно и реализовано)) Код (Text): $link = mysqli_connect("127.0.0.1", "my_user", "my_password", "my_db"); if (!$link) { echo "Ошибка: Невозможно установить соединение с MySQL." . PHP_EOL; echo "Код ошибки errno: " . mysqli_connect_errno() . PHP_EOL; echo "Текст ошибки error: " . mysqli_connect_error() . PHP_EOL; exit; } то есть если нет подключения к базе просто выводим строку ошибки и прекращаем работу скрипта) если нет базы - смысл что то грузить дальше)
Я тоже об этом думал, но нельзя ли сделать так, чтоб страница грузилась без данных из БД, то есть чтоб грузилась сама структура (Шапка, маин блок, а котором, собственно, сами оповещения, футер, и т.д.)?
проблема в том что в большинстве проектов тот же хидер динамический, что бы он загрузился нужно получить из БД какие то даные.. имя страницы, какой то текст или еще что то.. как вариант сделать статический шаблон который выглядит как динамический шаблон скрипта и вызывать его)) но это дублирование - а это не очень кошерно)
Ладно, не буду, короче, выпендриваться, и выведу при ошибке БД обычную чёрно-белую ошибку. Всё равно смысла нет страницу грузить когда БД не грузится. --- Добавлено --- Ок. Как быть с редиректами, когда нужно загрузить ту же страницу, с теми же гет параметрами, но ошибка связана с каким-то параметром? Тогда при обработке ошибки скрипт перенаправляет браузер по тому же адресу, и так до посинения.
А зачем делать цикл ? должен понимать PHP: <?php if ( isset( $_GET['error'] ) ) { header ( 'Location: /?error' ); exit; }
не совсем понял проблему... но вот к примеру... страница где нужно вводить какие то данные, ИМЯ ФАМИЛИЮ ОТЧЕСТВО ПОЛ... это дочерняя страница к примеру списка учащихся в школе. если данные ввели правильно - то после добавления данных в БД нас редиректит на список учащихся .. если данные ввели не правильно то мы остается на странице ввода данных и видим уведомления про ошибку без всяких редиректов.. --- Добавлено --- если Вы про мой ответ - то ошибок может быть несколько и их нужно вывести под хидером что бы пользователь видел в чем он накосячил) --- Добавлено --- Вот на скрине пример того как это у меня выглядит))
Там фигня реализовать у него с БД велосипеды, где то уже писалось, найду... --- Добавлено --- Проверка статуса подключения к MySQL, БД N, и наличия таблиц
Иногда прходится делать так что добавление ошибки происходит после вывода ошибок. Для этого используются редиректы. Получается что я вижу что какой-то параметр неправильный, создаю метку с ошибкой, дохожу до конца, проверяю, есть ли ошибки, если есть - редирект на эту же страницу. И всё сначала. Я то могу редиректиться на другую страницу, но нужно же остаться на этой же, да при том что все остальные get параметры должны остаться.
добавь флаг к урл при переправке /?error&... PHP: <?php if ( isset ( $_GET[...], $_GET[...] ) && !isset ( $_GET['error'] ) ) { код выполнения } else { форма + ( isset ( $_GET['error'], $_GET['a'] ) ? lol : '' ) ... ( isset ( $_GET['error'], $_GET['e'] ) ? lol : '' ) }
И надписью, что "Пожалуйста, повторите попытку позже, проблема скоро будет исправлена", или типа того. Чтобы он понял, что сайт, в общем-то работает и поддерживается, но не в данную секунду. А еще можно сделать так, чтобы тебе на почту письма шли, если ошибка возникает. Главное - сделать фильтр, чтобы одна и та же ошибка не вызывала мириады писем. Это настраивается на уровне сервера, к слову. Костылить не надо. И можно по крону проверять изменения в логах, после чего отправлять письмо.