|
|
|
| Подскажите пожалуйста, есть форма, в нее вводятся данные. После этого данные обрабатываются через пхп. После обработки ниже под формой выводится сообщение о результате работы пхп. Сразу после этого происходит перезагрузка страницы для того что бы сбросить POST-данные. Вопрос: как сделать так что бы данные сбрасывались, а сообщение о работе скрипта остались? Спасибо. | |
|
|
|
|
|
|
|
для: magic
(18.03.2011 в 00:32)
| | А что в сообщении выводится (и как много)? Эта надпись зависит от работы обработчика? | |
|
|
|
|
|
|
|
для: cheops
(18.03.2011 в 00:35)
| | Ну к примеру, что данные добавлены успешно или что надо какие то данные под корректировать. Нет, не много одно два небольших предложения. Да, зависит от скрипта, как написал выше, это сообщение о результатах работы скрипта.
Может их записывать в какую то переменную и потом выводит, ну что то пока не получилось. | |
|
|
|
|
|
|
|
для: magic
(18.03.2011 в 00:39)
| | Хм... может во время перезагрузки передавать это сообщение (или флаг обозначающий статус сообщения) через GET-параметр? А на той странице, куда перебрасывается пользователь выводить то, что в GET-параметре или принимать решение о том, что выводить в зависимости от значения флага? | |
|
|
|
|
|
|
|
для: magic
(18.03.2011 в 00:39)
| | Get параметр будет самым верным решением, точнее самым простым, ведь если я правильно понял, ajax задействоваться не будет. После обработки формы, вы перенаправляете пользователя на адрес вида file.php?message=данные успешно добавлены, а перед выводом страницы проверяете эту переменную на наличие сообщения. Такой подход не даст повторно показаться сообщению при переходе на другие страницы сайта. Остальные способы будут посложнее в реализации.
Хотя есть еще один способ, правда немного отклоняется от ТЗ.
Пользователь отправляет данные, обработчик их приняв выдает чистый лист с html-редиректом от 1 до n секунд и сообщение, к примеру по центру экрана об успешном добавлении информации. Через пару секунд срабатывает редирект на нужный адрес.
Минус первого подхода - браузерная история сохранит сообщение об ошибке, так как оно является частью адреса.
Минус второго - ждать обычно западло, когда там произойдет этот html-редирект, особенно если есть потребность в многократном использовании одной и той же формы.
Можно еще реализовать с помощью сессии, но могут быть небольшие сложности в зависимости от платформы приложения, ну и самый симпатичный вариант - это конечно же ajax. | |
|
|
|
|
|
|
|
для: deimand
(18.03.2011 в 01:46)
| | Дело все в том, что второй способ с выводом сообщения на новой странице и редиректа через n секунд, работает нормально и в первом способе. Под формой выводится сообщение о результатах работы скрипта. Но когда происходит редирект для сброса POST-данных естественно открывается чистая форма без данных и что плохо без сообщения. Человек даже может и не успеть прочитать его. А если поставить по больше время, то тогда нет гарантии, что за это время еще раз не нажмут "отправить".
А вот по поводу аякса можно и подумать, но сам я не силен в нем. Есть где нибудь в свободном доступе скрипт для подключения отдельным файлом и как это будет работать?
Заранее спасибо | |
|
|
|
|
 246.1 Кб |
|
|
для: magic
(18.03.2011 в 12:41)
| | Что значит под формой выводится сообщение? Что делает эта форма, раз после редиректа вы опять на нее попадаете? Какую информацию добавляете? Напишите подробнее.
Реализация отправки формы на аяксе зависит от типа формы и от того, что вы хотите после отправки этой формы видеть. Если взять к примеру этот форум (ответ на сообщение), то здесь удобнее всего на мой взгляд было бы сделать следующим образом:
По нажатию на кнопку ответить, под этим сообщением появляется форма (см. прикрепленный файл), а по нажатию на кнопку отправить эта форма пропадает, заменяясь вашим сообщение. В данном случае отпадает потребность в каких либо извещениях вообще, так как вы сразу видите результат и скролл остается в том же положении. | |
|
|
|
|
 71 Кб |
|
|
для: deimand
(18.03.2011 в 13:36)
| | см. прикрепленный файл ------------> | |
|
|
|
|
|
|
|
для: magic
(18.03.2011 в 14:49)
| |
<?php
if(!empty($_POST))
{
//Производим обработку формы
......
//Помещаем сообщение для пользователя в $_GET['message']
$_GET['message'] = "...";
//Через 10 секунд страница будет перезагружена, при этом в GET-параметре будет передано сообщение
header("Refresh: 10;url=".$_SERVER['PHP_SELF']."?message=".urlencode($_GET['message']));
}
?>
<form method='POST'>
<input type='text' name='name' value='<?=htmlspecialchars($_POST['name'])?>'>
......
</form>
<?php
if(!empty($_GET['message']))
{
echo htmlspecialchars($_GET['message']);
}
?>
|
| |
|
|
|
|
 71.8 Кб |
|
|
для: magic
(18.03.2011 в 14:49)
| | На аяксе ваш пример реализуется очень даже просто.
Подробно код описан здесь здесь, я лишь не много его изменил под ваш случай.
form.php
<html>
<head>
<script type="text/javascript" language="javascript">
block = 0;
var req = Create();
function ge(id)
{
return document.getElementById(id);
}
function Create()
{
if(navigator.appName == "Microsoft Internet Explorer")
{
req = new ActiveXObject("Microsoft.XMLHTTP");
}
else
{
req = new XMLHttpRequest();
}
return req;
}
function Request(query)
{
req.open('post', 'action.php' , true );
req.onreadystatechange = Refresh;
req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=utf-8");
req.send(query);
}
function Refresh()
{
if( req.readyState == 4 )
{
var b = req.responseText;
if (b=='Ok')
{
ge('ajax').innerHTML = 'Данные добавлены успешно';
ge('myid').value = ''; // сразу очистить поля
var res = setTimeout(reset,7000); // стереть сообщение через 7 секунд
}
else
{
ge('ajax').innerHTML = b;
}
}
block = 0;
}
function Pusk()
{
// от двойных кликов
if (block == 1) return false;
block = 1;
var query;
query ='txt='+encodeURIComponent(ge('myid').value);
Request(query);
}
function reset()
{
ge('ajax').innerHTML = '';
}
</script>
</head>
<body>
<input type="text" id="myid"><br><br>
<input type="button" value="ТЫРЦ" onClick="Pusk()">
<div id="ajax"></div>
<img src="prel.gif" width="1" height="1" />
</body>
</html>
|
action.php
<?php
$txt = isset($_POST['txt']) ? $_POST['txt'] : NULL;
if (!empty($_POST['txt']))
{
echo 'Ok';
}
else
{
echo 'Не все поля заполнены';
}
exit;
?>
|
| |
|
|
|
|
|
|
|
для: magic
(18.03.2011 в 00:32)
| | Насколько я понял, цель такова:
- сначала вывести форму, затем, после отправки формы, вывести ещё раз эту форму и под ней сообщение о результатах её обработки.
Не совсем понятно для чего вам необходимо сбросить данные в массиве POST можно просто сделать так:
<form metod='POST'>
...
</form
<?php
if(!empty($_POST))
{
//Производим обработку форму
......
//Генерируем сообщение для пользователя
$message = "...";
//Выводим сообщение о результатах обработки
echo $message;
}
?>
|
Если же жизненно необходимо сделать так, чтобы после отправки формы о наличии данных в массиве POST узнала только та часть скрипта, которая выполняет их обработку и генерирует сообщение, то можно поступить так:
<?php
//Этот код расположен в начале скрипта
if(!empty($_POST))
{
//Выполняете обработку данных
.....
//Генерируете сообщения для пользователя
$message = "...";
//Уничтожаем массив $_POST
unset($_POST);
}
......
?>
<form metod='POST'>
...
</form
<?php
if(!empty($message))
{
//Выводим сообщение о результатах обработки
echo $message;
}
?>
|
| |
|
|
|
|
|
|
|
для: Ирбис
(18.03.2011 в 13:18)
| | Подскажите еще такое, воспользовался уничтожением $_POST данных через UNSET.
<?php
//Этот код расположен в начале скрипта
if(!empty($_POST))
{
//Выполняете обработку данных
.....
//Генерируете сообщения для пользователя
$message = "...";
//Уничтожаем массив $_POST
unset($_POST);
}
......
?>
<form metod='POST'>
...
</form
<?php
if(!empty($message))
{
//Выводим сообщение о результатах обработки
echo $message;
}
?>
|
Все нормально, но вот когда нажимаешь обновить данные опять заполняются, почему?
Т.е. когда нажимаешь добавить в самой форме, форма после отработки скрипта очищается, но при нажатии обновить опять появляются пост данные. Откуда они берутся ведь в принципе они уничтожены. | |
|
|
|
|
|
|
|
для: magic
(31.03.2011 в 15:07)
| | . | |
|
|
|
|
|
|
|
для: magic
(18.03.2011 в 00:32)
| | Рекомендую после обработки скрипта делать следующее:
1. записывать в куку result результат
2. делать редирект на REQUEST_URI
3. при наличии result ее выводить и тут же делать unset($_COOKIE['result'])
данное решение имеет лишь один минус - его (данное решение) нужно сделать.
и нет минусов передачи результата в гете, браузерной истории, возможности написать что угодно (в этом смысле, cheops прав, передавать код сообщения верно, а вот само сообщение - нет... собственно это относится и к куке) | |
|
|
|