Что хороший путь состоит в том, чтобы показать ошибки/сообщения пользователям в php?

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

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

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 (); сверху каждой страницы для отображения возможных ошибок, которые могли бы быть броском к этой странице.

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

5
задан 5 February 2010 в 07:19
поделиться

2 ответа

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

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

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 .

3
ответ дан 15 December 2019 в 01:00
поделиться

В C++ автоматические переменные не определены до тех пор, пока им не будет явно присвоено значение. Возможно, вы думаете о C # или других языках .Net, или Java.

-121--1203735-

Посмотрите на функцию strcat .

В частности, вы можете попробовать:

const char* name = "hello";
const char* extension = ".txt";

char* name_with_extension;
name_with_extension = malloc(strlen(name)+1+4); /* make space for the new string (should check the return value ...) */
strcpy(name_with_extension, name); /* copy name into the new var */
strcat(name_with_extension, extension); /* add the extension */
-121--1293997-

Честно говоря, я бы сделал это не с сессиями, а с 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');

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

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

1
ответ дан 15 December 2019 в 01:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: