Какой хороший способ показать ошибки / сообщения пользователям в php? - PullRequest
5 голосов
/ 05 февраля 2010

Я использовал свой собственный метод в течение многих лет, но я подумал, что, возможно, это не лучший способ сделать это.

По существу, когда я хочу выдать ошибку пользователю или отобразить подтверждение успешного действия, я делаю следующее:

if($something == "condition") {

   $_SESSION["message"] = "Your passwords didnt match! Make sure they are the same in both fields!";
   $_SESSION["message_type"] = 1;
   header("Location:register.php");
   exit();

}

тогда у меня есть функция, как

function show_message() {
   global $_SESSION;

   if (isset($_SESSION["message"])) { 
      echo "<div class='site_message type_" . $_SESSION["message_type"] . "'>" . $_SESSION["message"] . "</div>"; 
      unset($_SESSION["message"]); 
      unset($_SESSION["message_type"]); 
   }
}

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

Каковы возможные проблемы с этим?

Ответы [ 2 ]

3 голосов
/ 05 февраля 2010

Я не вижу ничего плохого в этом подходе.Вы найдете эту технику под разными именами в целом ряде сред, например FlashMessenger в Zend Framework .Обычно Session оборачивается в объект вместо обычного массива Session и с ViewHelper вместо функции.

Чтобы убедиться, что у вас нет опечаток в ключах Session при назначении сообщения, вы можетеОберните присваивающий код в функцию, например,

function set_message($text, $type)
{
    $_SESSION['message'] = array(
        'text' => $text,
        'type' => $type
    );
}

. Вы могли бы улучшить ее, если бы функция возвращала строку вместо echo ее и лично я бы использовалsprintf для форматирования вывода.Делает код несколько более читабельным imho, например,

return sprintf('<div id="message-box" class="type-%s">%s</div>',
                $_SESSION["message"]["text"], 
                $_SESSION["message"]["type"]);

Как указывал @Gumbo, функция может не работать, когда сеансы не работают, но это, вероятно, создаст ряд других проблем для всего приложения.поэтому я бы не стал беспокоиться об этом конкретном фрагменте кода.

Незначительная вещь: $ _SESSION - это суперглобальный , поэтому вам не нужно использовать ключевое слово global.

1 голос
/ 07 февраля 2010

Честно говоря, я бы сделал это не с сеансами, а с URL.

Вместо установки сообщения создайте класс, который содержит «Системные сообщения»

 class SystemMessages{
    protected $messages = array(
          0 => "Some Error Message");

    public function getMessage($id)
    {
        return $this->messages[$id];
    }
 }

Затем в вашем register.php проверьте параметр URL:

$messageObject = new SystemMessages;
if(!empty($_GET['message']))
{
    $message_id = intval($_GET['message']); // Clean User Input
    $message = $messageObject->getMessage($message_id);
    // handle message
}

Если вы показываете сообщение ТОЛЬКО, тогда оно действительно не является «конфиденциальной» информацией, и, следовательно, должно быть прекрасно поместить его в URL.

Тогда вы просто

 header('Location: register.php?message=0');

Работает с / без куки, и вы его гораздо более централизованы. Если вы хотите изменить формулировку сообщения, все сообщения находятся в одном месте.

Просто мысль ....

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...