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

Форум PHP

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

 

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

вид форума:
Линейный форум (новые сообщения вниз) Структурный форум

тема: Перезагрузка страницы

Сообщения:  [1-10]   [11-14] 

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

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

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

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

  Ответить  
 
 автор: magic   (02.04.2011 в 22:30)   письмо автору
 
   для: magic   (31.03.2011 в 15:07)
 

.

  Ответить  
 
 автор: 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

?>

Все нормально, но вот когда нажимаешь обновить данные опять заполняются, почему?

Т.е. когда нажимаешь добавить в самой форме, форма после отработки скрипта очищается, но при нажатии обновить опять появляются пост данные. Откуда они берутся ведь в принципе они уничтожены.

  Ответить  
 
 автор: 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 в 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']);
}
?>

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

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

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

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

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

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

  Ответить  
 
 автор: Ирбис   (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   (18.03.2011 в 12:41)   письмо автору
 
   для: deimand   (18.03.2011 в 01:46)
 

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

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

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

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

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

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

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

  Ответить  

Сообщения:  [1-10]   [11-14] 

Форум разработан IT-студией SoftTime
Rambler's Top100
вверх

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