Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Перезагрузка страницы
 
 автор: magic   (18.03.2011 в 00:32)   письмо автору
 
 

Подскажите пожалуйста, есть форма, в нее вводятся данные. После этого данные обрабатываются через пхп. После обработки ниже под формой выводится сообщение о результате работы пхп. Сразу после этого происходит перезагрузка страницы для того что бы сбросить POST-данные. Вопрос: как сделать так что бы данные сбрасывались, а сообщение о работе скрипта остались? Спасибо.

  Ответить  
 
 автор: cheops   (18.03.2011 в 00:35)   письмо автору
 
   для: magic   (18.03.2011 в 00:32)
 

А что в сообщении выводится (и как много)? Эта надпись зависит от работы обработчика?

  Ответить  
 
 автор: magic   (18.03.2011 в 00:39)   письмо автору
 
   для: cheops   (18.03.2011 в 00:35)
 

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

Может их записывать в какую то переменную и потом выводит, ну что то пока не получилось.

  Ответить  
 
 автор: cheops   (18.03.2011 в 00:47)   письмо автору
 
   для: magic   (18.03.2011 в 00:39)
 

Хм... может во время перезагрузки передавать это сообщение (или флаг обозначающий статус сообщения) через GET-параметр? А на той странице, куда перебрасывается пользователь выводить то, что в GET-параметре или принимать решение о том, что выводить в зависимости от значения флага?

  Ответить  
 
 автор: deimand   (18.03.2011 в 01:46)   письмо автору
 
   для: magic   (18.03.2011 в 00:39)
 

Get параметр будет самым верным решением, точнее самым простым, ведь если я правильно понял, ajax задействоваться не будет. После обработки формы, вы перенаправляете пользователя на адрес вида file.php?message=данные успешно добавлены, а перед выводом страницы проверяете эту переменную на наличие сообщения. Такой подход не даст повторно показаться сообщению при переходе на другие страницы сайта. Остальные способы будут посложнее в реализации.

Хотя есть еще один способ, правда немного отклоняется от ТЗ.
Пользователь отправляет данные, обработчик их приняв выдает чистый лист с html-редиректом от 1 до n секунд и сообщение, к примеру по центру экрана об успешном добавлении информации. Через пару секунд срабатывает редирект на нужный адрес.

Минус первого подхода - браузерная история сохранит сообщение об ошибке, так как оно является частью адреса.

Минус второго - ждать обычно западло, когда там произойдет этот html-редирект, особенно если есть потребность в многократном использовании одной и той же формы.

Можно еще реализовать с помощью сессии, но могут быть небольшие сложности в зависимости от платформы приложения, ну и самый симпатичный вариант - это конечно же ajax.

  Ответить  
 
 автор: magic   (18.03.2011 в 12:41)   письмо автору
 
   для: deimand   (18.03.2011 в 01:46)
 

Дело все в том, что второй способ с выводом сообщения на новой странице и редиректа через n секунд, работает нормально и в первом способе. Под формой выводится сообщение о результатах работы скрипта. Но когда происходит редирект для сброса POST-данных естественно открывается чистая форма без данных и что плохо без сообщения. Человек даже может и не успеть прочитать его. А если поставить по больше время, то тогда нет гарантии, что за это время еще раз не нажмут "отправить".
А вот по поводу аякса можно и подумать, но сам я не силен в нем. Есть где нибудь в свободном доступе скрипт для подключения отдельным файлом и как это будет работать?
Заранее спасибо

  Ответить  
 
 автор: deimand   (18.03.2011 в 13:36)   письмо автору
246.1 Кб
 
   для: magic   (18.03.2011 в 12:41)
 

Что значит под формой выводится сообщение? Что делает эта форма, раз после редиректа вы опять на нее попадаете? Какую информацию добавляете? Напишите подробнее.

Реализация отправки формы на аяксе зависит от типа формы и от того, что вы хотите после отправки этой формы видеть. Если взять к примеру этот форум (ответ на сообщение), то здесь удобнее всего на мой взгляд было бы сделать следующим образом:

По нажатию на кнопку ответить, под этим сообщением появляется форма (см. прикрепленный файл), а по нажатию на кнопку отправить эта форма пропадает, заменяясь вашим сообщение. В данном случае отпадает потребность в каких либо извещениях вообще, так как вы сразу видите результат и скролл остается в том же положении.

  Ответить  
 
 автор: magic   (18.03.2011 в 14:49)   письмо автору
71 Кб
 
   для: deimand   (18.03.2011 в 13:36)
 

см. прикрепленный файл ------------>

  Ответить  
 
 автор: Ирбис   (18.03.2011 в 15:30)   письмо автору
 
   для: 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']);
}
?>

  Ответить  
 
 автор: deimand   (19.03.2011 в 02:25)   письмо автору
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;

?>

  Ответить  
 
 автор: Ирбис   (18.03.2011 в 13:18)   письмо автору
 
   для: 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;
}
?>

  Ответить  
 
 автор: magic   (31.03.2011 в 15:07)   письмо автору
 
   для: Ирбис   (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   (02.04.2011 в 22:30)   письмо автору
 
   для: magic   (31.03.2011 в 15:07)
 

.

  Ответить  
 
 автор: Shorr Kan   (04.04.2011 в 11:22)   письмо автору
 
   для: magic   (18.03.2011 в 00:32)
 

Рекомендую после обработки скрипта делать следующее:

1. записывать в куку result результат
2. делать редирект на REQUEST_URI
3. при наличии result ее выводить и тут же делать unset($_COOKIE['result'])

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

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования