Модераторы: skyboy, MoLeX, Aliance, ksnk

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Запрет на повторного выполнения скрипта 
:(
    Опции темы
Alexey007
Дата 1.4.2007, 15:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 30.3.2007

Репутация: 1
Всего: 1



Вот такая структура у меня. Задача в следующем: после того как новость добавлена сделать следущее(на выбор):
1. просто напросто запретить обновлять страницу(если нажать F5, то штоб текст выскакивал: новость добаления, второй раз добавить нельзя)
2. Чтобы через секунду-две страница сама по себе возращалась на страницу добавления новости.
Ваши предложения что лучше и как сделать?)
Код

if(isset($act))
  {
  if($act=='add')
    {
Сам скрипт добавления новости 
    }
    }else{
echo'Форма добаления новости к примеру';  
 }


Это сообщение отредактировал(а) Alexey007 - 1.4.2007, 15:24
PM MAIL   Вверх
SelenIT
Дата 1.4.2007, 15:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


баг форума
****


Профиль
Группа: Завсегдатай
Сообщений: 3996
Регистрация: 17.10.2006
Где: Pale Blue Dot

Репутация: 32
Всего: 401



Alexey007, вообще-то традиционно в таких случаях после добавления просто делают редирект на форму:
Код

...
  if($act=='add')
    {
Сам скрипт добавления новости 

      header('Location: http://'.$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'].'?act=form');
      exit();
    }
...

Возможны варианты (редирект на промежуточную страницу с результатом действия и ссылкой "продолжить", редирект JavaScript-ом и т.д.), но вот это - классика и потому считается надежнее и универсальнее всего...


--------------------
Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму!
PM MAIL   Вверх
Alexey007
Дата 1.4.2007, 15:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 30.3.2007

Репутация: 1
Всего: 1



а можно сделать с ЗАДЕРЖКОЙ 1-2 сек?
PM MAIL   Вверх
Alix36
Дата 1.4.2007, 16:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 478
Регистрация: 6.11.2006

Репутация: 1
Всего: 3



sleepом не пробывал? или те где задержка нужна?


--------------------
Наши лица как дым, И никто не узнает как мы победим. (С)Пикник.
PM MAIL   Вверх
Alexey007
Дата 1.4.2007, 16:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 30.3.2007

Репутация: 1
Всего: 1



Спасибо, Alix36.
Sleep поможет, если только сделать переадресацию. с header не поможет, т.к. тег мне ставить между body нужно
PM MAIL   Вверх
cia
Дата 2.4.2007, 14:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 207
Регистрация: 15.1.2007

Репутация: 4
Всего: 4



Выкинь в браузер код редиректа на JavaScript. Т.е. после обработки выводи что хочешь, но также добавь что-то вроде этого:

Код

echo("<script>\n".
    "setTimeout(show, 5000);\n".
    "document.location=\"myURL\";\n".
    "</script>");

PM WWW ICQ   Вверх
boombick
Дата 2.4.2007, 15:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 305
Регистрация: 20.4.2005
Где: Moscow, Russia

Репутация: 2
Всего: 9



Господа, ну что вы? Для реализации редиректа стредствами HTML есть специальный meta-тег
Код

<meta http-equiv="Refresh" content="1; URL=http://example.com/">

В примере редирект произойдет через одну секунду на адрес example.com
Решение работает и с отключенным js, в отличие от способа cia


--------------------
Все вышесказанное - имхо, и на истину в последней инстанции не претендует
------
UNIX and other
PM MAIL WWW ICQ   Вверх
Alexey007
Дата 24.4.2007, 23:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 30.3.2007

Репутация: 1
Всего: 1



boombick, так мне не надо в мета тегах. я ж писал.

P.S. Вообщем задачу сам решил. Может поправить? Вот как:
Код

if(isset($_POST['doDelete']))
  {
    $row=mysql_fetch_array(mysql_query("SELECT * FROM news WHERE `id` = ".intval($_POST['id'])));
    $id_trash = $row[0];
    $name_trash = $row[1];
    $text_trash = $row[2];
    $site_trash = $row[3];
    $date_trash = $row[4];
    $img_trash = $row[5];
      if ($id_trash == "")
      {
       echo '<b><font color="#FF0000"><center>Новость не выбрана!</b></center></font>';
      }
      else
       {
       mysql_query("INSERT INTO `news_trash` ( `id` , `id_news` , `name` , `text` , `site` , `date` , `img` ) VALUES ('', '$id_trash', '$name_trash' , '$text_trash' , '$site_trash' , '$date_trash', '$img_trash')");
       echo '<b><font color="#FF0000"><center>Новость перемещена в корзину успешно!<br></b></center></font>';
       mysql_query("DELETE FROM `news` WHERE `id` = ".intval($_POST['id'])." LIMIT 1");
       }
  }

PM MAIL   Вверх
Gold Dragon
Дата 25.4.2007, 08:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 10
Всего: 71



Что-то я не совсем понял... а почему просто напросто нельзя использовать с примеру куки (или сессии, или базу)? 

У меня такая же задача и я еёпросто делаю так

после проверки всего там этакого после удачного добавления сообщения (новости) я создаю кук с необходимой жизнью
Код

setcookie('index', time() ,time()+_COM_FLUD); // флуд-контроль

а дальше мне всё равно, перезагружалась страница или тыкали на "добавить", в начале стоит код
Код

$fludIndex = (isset($_COOKIE['index'])) ? $_COOKIE['index'] : '';
    if($fludIndex!=''){
    $temTime = _COM_FLUD-(time()-$fludIndex);

    $info['error'] =  '<p class=txt9>Ошибка!<br>На сайте установлен флуд-контроль.';
    $info['error'] .= '<br>Вы не можете сейчас добавить комментарий.';
    $info['error'] .= '<br>У Вас осталось '.$temTime.' секунд.';
    setcookie('error',$info['error'],time()+60); // это используется на странице, типа вывод предупреждения
    perehod('commentadd'); // здесь просто функция для перехода на нужную страницу
}


Это сообщение отредактировал(а) Gold Dragon - 25.4.2007, 08:11


--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
Alexey007
Дата 26.4.2007, 23:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 30.3.2007

Репутация: 1
Всего: 1



Gold Dragon, ну пройдет данное время, человек нажмет перегрузить страницу. и опять добавится сообщение smile 
PM MAIL   Вверх
Gold Dragon
Дата 27.4.2007, 07:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 10
Всего: 71



Я что-то не понял, запретить вообще(!) повторное выполнение скрипта или что? И почему должно добавиться сообщение? После того как сообщение добавляется, то управление переходит на страницу результатов (ну или куда там ещё) и пусть хоть 10000 раз перезагружает, юзер увидит только результаты (только мне посещаемость увеличит smile ). Данных которые передаются для добавления уже нет smile Или у тебя как-то всё по другому организовано?

Это я решил через куки сделать (а просто люблю я куки smile ), а так можно и через базу... И отключение куков тогда не поможет.. Правда у меня ещё защита по IP стоит, типа х-раз в определённый промежуток времени нельзя с одно IP добавлять

Кстати, меня очень бесить (а я думаю не только меня) когда используется
Код

<meta http-equiv="Refresh" content="1; URL=http://example.com/">
Как говорится, за немя не надо ничего делать. Особенно раздражает "...подождите 10 секунд и вы перейдёте на страницу..." smile  Спрашивается нафига тратить моё время, да и сервер нафига лишний раз грузить




--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
Alexey007
Дата 27.4.2007, 15:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 30.3.2007

Репутация: 1
Всего: 1



Да е-мае. Вот ВЕСЬ код:
У меня после добавления высвечивается сообщение: новость добавлена. если нажать F5 то новость опять(!) добавится, а мне этого не нужно.
Код

include $my->PATH_REG.'/show_top.inc';
echo '<div align="center">';
if(isset($act))
  {
  if($act=='add')
    {
    $REQUEST_URI=str_replace('&act=add', '', $REQUEST_URI);
        $q="SELECT id FROM news";
        $res=mysql_query($q);
        $sizelimit = "yes"; //Do you want a size limit, yes or no?
        $sizebytes = "200000"; //size limit in bytes
        //$dl = "http://localhost/aragonia/"; //url where files are uploaded
        $w = '300';
        $h = '300';
        $size_img = getimagesize($img);
        $absolute_path = $my->PATH_IMAGES_NEWS; //Absolute path to where files are uploaded
           $res=mysql_query("select * from news order by id desc limit 1");
           while($obj=mysql_fetch_object($res))
            {
           $id = $obj->id;
            }
               if (($size_img[0]<$w) and ($size_img[1]<$h))
               {
                   if($img == ""){}else
                   {
                   @copy($img, "$absolute_path/IMG_$img_name");
                   echo '<b><font color="#FF0000">Картинка закачана успешно!</b></font><br>';
                   }

                   if(($name_n == "") or ($text_n == ""))
                   {
                   echo '<b><font color="#FF0000">Вы не ввели обязательные поля!</b></font>';
                   include $my->PATH_AD_INC.'/news_add_form.inc';
                     }else
                     {
                        if(isset($visible_n))
                         {
                     if($res=mysql_query("INSERT INTO news (name, text, site, date, img, visible)
                                          values ('".addslashes($name_n)."', '".addslashes($text_n)."', '".addslashes($site_n)."', '$date_n', '$img_name', 'on')" ))
                      {
                     echo'<b><font color="#FF0000"><center>Новость добавлена!</b></font><br>
                          <a href="index.php?action=news_add">Вернуться и написать ещё новость.</center>';
                      }
                     else
                       {
                     echo '<b><font color="#FF0000"><center>Неудача добаления новости!</b></center></font>';
                       }
                         }
                        else
                         {
                     if($res=mysql_query("INSERT INTO news (name, text, site, date, img, visible)
                                          values ('".addslashes($name_n)."', '".addslashes($text_n)."', '".addslashes($site_n)."', '$date_n', '$img_name', 'off')" ))
                      {
                     echo'<b><font color="#FF0000"><center>Новость добавлена!</b></font><br>
                          <a href="index.php?action=news_add">Вернуться и написать ещё новость.</center>';
                      }
                     else
                       {
                     echo '<b><font color="#FF0000"><center>Неудача добаления новости!</b></center></font>';
                       }
                         }
                     }
               }
               else
                {
               echo 'Максимальный размер картинки: <b><font color="#FF0000">'.$sizebytes.'</b></font> (в байтах)<br>';
               echo 'Максимальные ширина/высота картинки: <b><font color="#FF0000">'.$w.'/'.$h.'</b></font> (в пикселях), У Вас: '.$size_img[0].'/'.$size_img[1].'<br>';
                     if(($name_n == "") or ($text_n == ""))
                     {
                     echo '<b><font color="#FF0000">Вы не ввели обязательные поля!</b></font>';
                     include $my->PATH_AD_INC.'/news_add_form.inc';
                     }
                }
    }
  }
  else
  {
include $my->PATH_AD_INC.'/news_add_form.inc';
  }
echo '</div>';
include $my->PATH_REG.'/show_bottom.inc';
include $my->PATH_AD_INC.'/end.inc';

PM MAIL   Вверх
cia
Дата 28.4.2007, 06:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 207
Регистрация: 15.1.2007

Репутация: 4
Всего: 4



При нажатии F5 происходит повторное выполнение этого скрипта с теми же параметрами. Просто перед добавлением проверь нет ли уже записи с такими данными.

Код

'select id from news where name="'.addslashes($name_n).'", text="'.addslashes($text_n).'", site="'.addslashes($site_n).'"';
                      {
PM WWW ICQ   Вверх
Gold Dragon
Дата 28.4.2007, 08:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 10
Всего: 71



Вообще-то правельнее было бы разделить на код где добавляются данные и на код вывода результатов (я про это и говорил). Тогда такая проблема сразу пропадает. 

А если смотреть по коду, то как вариант можно в самом конце скрипта уничножить переменную
Код

unset($act);

и условие не будет выполняться при перезагрузки
Код

....
if(isset($act))
  {
  if($act=='add')
   {
.... 

правда я не знаю как она у тебя формируется...


--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
Всемогущий
Дата 28.4.2007, 08:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 440
Регистрация: 25.6.2006
Где: Челябинск

Репутация: 5
Всего: 13



на мой взгляд нужно сделать дополнительное поле (INT) в котором хранить CRC32() от склеивания всех текстовых данных одной строки,
сделать индекс по этому полю,
и до добавления спрашивать есть ли совподения


--------------------
Цитата(smartov @  16.1.2007,  13:26 Найти цитируемый пост)
Видел я PHP код, который пишут наСильники, никогда на php не писавшие  :D  То еще зрелище. Все пытаются сделать руками и через ж (как в С привыкли). Все пытаются память освобождать итд итп. 
PM MAIL ICQ   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1281 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.