Я использовал свой собственный метод в течение многих лет, но я изобразил, возможно, не лучший способ пойти об этом.
По существу, когда я хочу бросить ошибку в пользователя или подтверждение дисплея успешного действия, я делаю следующее:
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 (); сверху каждой страницы для отображения возможных ошибок, которые могли бы быть броском к этой странице.
Каковы возможные проблемы с этим?
Я не вижу ничего плохого в этом подходе. Вы найдете эту технику под разными именами во многих фреймворках, например 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
.
В 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, и вы это гораздо более централизовано. Если вы хотите изменить формулировку сообщения, все сообщения находятся в одном и том же месте.
Просто мысль...