Модераторы: 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   Вверх
Alexey007
Дата 28.4.2007, 12:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Gold Dragon, во-во...
можно поподробнее?
PM MAIL   Вверх
Gold Dragon
Дата 28.4.2007, 14:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



ну так я написал тебе... поставь перед else это unset($act); и попробуй..

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


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


Опытный
**


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

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



Alexey007
Используй стандартный метод, который описал SelenIT
Цитата

Код

...
  if($act=='add')
    {
Сам скрипт добавления новости 
      header('Location: http://'.$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'].'?act=form');
      exit();
    }
...



Зачем изобретать велосипед и что-то усложнять? А если тебе потребуется проверка данных, перед добавлением их базу? Если что-то не пройдёт проверку, массив обнулится и придётся всё набирать заново.
PM MAIL WWW ICQ   Вверх
Gold Dragon
Дата 28.4.2007, 15:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(capitan @  28.4.2007,  14:31 Найти цитируемый пост)
Если что-то не пройдёт проверку, массив обнулится и придётся всё набирать заново.
Неее, обнулять не всё надо, только $act=='add', все остальные поля должны быть с уже ранее набранным текстом. Очень обидно когда набираешь набираешь, а из-за какой-нить ошибки все поля приходится занова заполнять...

Кстати, я думаю не стоит базу такими пустяками тревожить, можно обойтись и куками  smile 


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


iOS Lead Developer
****


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

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



Gold Dragon, контрольный вопрос: а если в браузере куки вырублены? smile Ведь пока еще это явление вполне имеет место быть.


--------------------
user posted image

user posted image
PM MAIL ICQ Skype   Вверх
capitan
Дата 28.4.2007, 18:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Можно заместо кук использовать сессии. Они работают всегда.
PM MAIL WWW ICQ   Вверх
Alexey007
Дата 28.4.2007, 22:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



У меня такое ощу щение, что никто меня не понимает!
Я ЯСНО выражаюсь:
Цитата(Alexey007 @  1.4.2007,  16:48 Найти цитируемый пост)
 с header не поможет, т.к. тег мне ставить между body нужно

А мне пишут:
Цитата(boombick @  2.4.2007,  15:11 Найти цитируемый пост)
Господа, ну что вы? Для реализации редиректа стредствами HTML есть специальный meta-тег

Цитата(capitan @  28.4.2007,  14:31 Найти цитируемый пост)
Alexey007, Используй стандартный метод, который описал SelenIT, 



Gold Dragon, Ну так я написал код редактирования новостей.. прошу помочь исправить\обновить.
А как именно Разделить на 2 части? Модешь по-подродробнее плиз.
PM MAIL   Вверх
BuShaRt
Дата 28.4.2007, 22:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1391
Регистрация: 29.6.2006

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



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

В целом былы представленны действительно рабочие методы борьбы с ситуацие:
1. разделение файла на несколько частей
т.е. в поле action формы прописать файл добавления новости, который header'ом кинет потом на исходную страницу.
про задержку тебе достаточно полно написали кучу методов
2. Блокировка по времени
3. Блокировка по идентичным записям в базе

Единственного метода не существует, каждый привлекателен в определенной ситуации...

Gold Dragon
unset не поможет, честно говоря не знаю почему, просто была похожая проблема - не помогало :(




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


Шустрый
*


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

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



BuShaRt
По пунктам:
1. Не получится даже разбить файл.. потому что этот header я так понял надо вставлять вначале страниы(всей)
2. по времени не пойдет, т.к. запрет должен быть навсегда..
3. а если новоть повторится? а это может быть.

Есть вопрос: вот допустим редактирование новости, после этого переходит, например, на страницу messenger.php по коду который берет данные в виде $_POST[name].. о после удачного редактирования переменную стирает...
Такое возможно сделать?
PM MAIL   Вверх
BuShaRt
Дата 29.4.2007, 00:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1391
Регистрация: 29.6.2006

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



Alexey007
1. Нет, header обсалютно не обязательно ставить в самом начале строки. Просто до него не должно быть вывода информации.

Сам по суди, ведь несколько не логично сначала начать заполнять контент для отправки на клиент, а потом вдруг взять и просто перейти совершенно на другую страницу бросив этот контент в некуда...

Правило очень просто: "header можно и нужно использовать не только в начале строки, но он должен срабатывать четко по некоторым условиям"... 

На пример "Вы удачно добавили новость", должно быть не до header, а выводиться в скрипте, допусти при получение GET-запроса с переменной stasut=add_ok

Старался как можно ясней рассказать, не знаю получилось ли)


2.Новость может повториться и с абсолютно идеальной системой защиты от повторени т.к. человеческий фактор...
... И даже проверка в бд, не сработает если символ "А" писать сначала на кирилице, а потом на латинице...


3.Не до конца понял, про редактирование... Вообще как выще указывал Gold Dragon переменные удаляються функцией unset, но с $_POST этот прием не срабатывает, сам не знаю почему, может гуру ответят smile


PM MAIL   Вверх
Alexey007
Дата 29.4.2007, 01:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



BuShaRt
Цитата(BuShaRt @  29.4.2007,  00:19 Найти цитируемый пост)
Старался как можно ясней рассказать, не знаю получилось ли)

вроде понял. smile 
Т.е. создать файл некий header.inc, в нем прописать
Код

if(isset($act))
  {
  if($act == 'edit')
    {
          sleep(10);
          header('Location: index.php?action=news_edit');
          exit();
     }
   }

и вставить методом
Код

include 'header.inc';

ДО вывода всех данных...
Но только в течение 10 секунд если пользователь перегрузит страницу (F5), то данные опять добавятся. smile 

Помогите написать по умному систему добавления/редактирования/удаления новостейsmile
А то я так чувствую что у меня все оч и оч криво сделано:(
Весь движок даже.... smile 

P.S. если кто может, дам весь движок.. и подскажете, что и как подправить.. может у меня ещё и дыр куча. smile 

Это сообщение отредактировал(а) Alexey007 - 29.4.2007, 01:37
PM MAIL   Вверх
BuShaRt
Дата 29.4.2007, 01:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1391
Регистрация: 29.6.2006

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



455  636  110  стучи

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


Опытный
**


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

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



Как я понимаю структура БД такова:
Код

`id` , `id_news` , `name` , `text` , `site` , `date` , `img` 

предроложим что новостей (SMALLINT -32768 | 32767)значит дальнейшие запросы будут  выполнятся менее 5 секунд.

теперь собственно пишу кусок кода добавления новости

Код

<?php
$id_news=$_POST['id_news']
$name=$_POST['name']
$text=$_POST['text']
$site=$_POST['site']
$date=$_POST['date']
$img=$_POST['img']
//для начала генерируем контрольную сумму для тех данных которые только что поступили

$correct=md5($name.$text.$site.$date.$img); //здесь должны быть поля в которых содежится информация поступившая непосредственно от человека
//те же поля используем в SQL запросе
$result = mysql_query("select `id` where  md5( concat( `name`,`text`, `site`,`date`,`img`))='$correct' limit 1") ;

if(@mysql_num_rows($result)!=1){

//процедура добавления новости

}else die('клоны нам не нужны');

?>


Это сообщение отредактировал(а) Всемогущий - 29.4.2007, 07:08


--------------------
Цитата(smartov @  16.1.2007,  13:26 Найти цитируемый пост)
Видел я PHP код, который пишут наСильники, никогда на php не писавшие  :D  То еще зрелище. Все пытаются сделать руками и через ж (как в С привыкли). Все пытаются память освобождать итд итп. 
PM MAIL ICQ   Вверх
BuShaRt
Дата 29.4.2007, 08:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1391
Регистрация: 29.6.2006

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



Всемогущий
На самом деле клоны будут в таком случае и запросы тяжеловатые... + проблемы возможны с кодировками...
Не знаю как вы, но лично я очень не доверяю стрингам на кирилице...

Если уж доверились, то по моему проверки по заголовку новости вполне хватит в данном случае риск очень минимален и решение пригодно для использования...


И вот я щас подумал, вроде об этом уже говорили... А почему бы просто после добавления не перекидывать на форму редактирования, а форма редактирования пусть обновляеться сколько угодно раз ;)


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


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1391
Регистрация: 29.6.2006

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



КСТАТЕ! Совсем забыли, ведь есть еще контроль по картинке, можно по тому же принципу input невидимый кидать на страницу и на сервере создавать пометку, что вот, для этого значения есть право добавить новость, после добавления это право умерает и снова надо жать кнопочку "добавление новости" smile
PM MAIL   Вверх
Всемогущий
Дата 29.4.2007, 10:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



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

решая проблему 
Цитата(BuShaRt @  29.4.2007,  10:55 Найти цитируемый пост)
 запросы тяжеловатые



Код

$correct=md5($_POST['name'].$tip.$_POST['cena']);

$result = mysql_query('SELECT md5(concat(`name`, `tip`,`cena`)) as correct  FROM `jobs`  ORDER BY  `id` DESC  LIMIT 1') ;

$line = mysql_fetch_array($result)  ;

if($correct==$line['correct'])die('был обнаружен двойник');



действительно странно 

Код

<?php
echo md5('кодировка');
echo "<br>\r\n";
echo md5(iconv("WINDOWS-1251","UTF-8" ,'кодировка'));
?>







--------------------
Цитата(smartov @  16.1.2007,  13:26 Найти цитируемый пост)
Видел я PHP код, который пишут наСильники, никогда на php не писавшие  :D  То еще зрелище. Все пытаются сделать руками и через ж (как в С привыкли). Все пытаются память освобождать итд итп. 
PM MAIL ICQ   Вверх
BuShaRt
Дата 29.4.2007, 11:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1391
Регистрация: 29.6.2006

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



Всемогущий
Вот это уже очень красивый подход ;)

Какнить потестирую smile
PM MAIL   Вверх
Gold Dragon
Дата 1.5.2007, 10:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(BuShaRt @  29.4.2007,  00:19 Найти цитируемый пост)
Вообще как выще указывал Gold Dragon переменные удаляються функцией unset, но с $_POST этот прием не срабатывает, сам не знаю почему, может гуру ответят
Это точно, правда я так и не понял почему, что-то в доках ничего не нашёл. Вернее POST легко удаляется (смотрет $GLOBALS до и после), но при перезагрузке опять появляется smile


В общем я попытался собрать свой код в одном месте ( у меня это разные файлы). 

commentadd.php
Код

<?php
/*********************************************************************
    Модуль для добавления комментариев
//*********************************************************************/
DEFINE('_COM_USER','Кто-то');
DEFINE('_COM_FLUD',180);
DEFINE('_COM_ERR1','<br>Не указано название.');
DEFINE('_COM_ERR2','Данные успешно добавлены.');
DEFINE('_COM_ERR3','<br>Отсутствует текст в поле отзыва.');

$content = modCommentAdd();
echo $content;

function modCommentAdd(){
    GLOBAL $baza;
    if(!isset($_POST['com'])){// вывод формы (начало)
        // получение данных из кука при завершении с ошибкой
        $info['name'] = (isset($_COOKIE['name'])) ? $_COOKIE['name'] : '';
        $info['user_com'] = (isset($_COOKIE['user_com'])) ? $_COOKIE['user_com'] : '';
        $info['user_nik'] = (isset($_COOKIE['user_name'])) ? $_COOKIE['user_nik'] : '';
        $info['user_mail'] = (isset($_COOKIE['user_mail'])) ? $_COOKIE['user_mail'] : '';
        $info['error'] = (isset($_COOKIE['error'])) ? $_COOKIE['error'] : '';
        // удаление данных об ошибке
        setcookie('error',$info['error'],time()-60);

        return sCommentAddForm($info);
    }else{// запись данных из формы
        $info['error'] = '';
        // проверка названия
        $info['name'] = strip_tags(trim($_POST['name']));
        if($info['name']=='') $info['error'] .= _COM_ERR1;
        // проверка коментария
        $info['user_com'] = strip_tags(trim($_POST['user_com']));
        if($info['user_com']=='') $info['error'] .= _COM_ERR3;
        // проверка именя юзера
        $info['user_nik'] = strip_tags(trim($_POST['user_nik']));
        if($info['user_nik']=='') $info['user_nik'] = _COM_USER;
        // проверка мыла
        $info['user_mail'] = validMail($_POST['user_mail']);
        // запись данных в кук
        setcookie("name",$info['name'],time()+60);
        setcookie("user_com",$info['user_com'],time()+60);
        setcookie('user_nik',$info['user_nik'],time()+60*60*24*10);
        setcookie('user_mail',$info['user_mail'],time()+60*60*24*10);
        // если есть ошибки
        if($info['error']!=''){
            // записать ошибки
            $info['error'] = '<p class=txt9>Ошибка!'.$info['error'];
            setcookie('error',$info['error'],time()+60);
            // переход на страницу вывода комментариев
            header("Location: http://".$_SERVER['HTTP_HOST']."/comment.php");
            exit;
        }
        // проверка на флуд
        $fludIndex = (isset($_COOKIE['index'])) ? $_COOKIE['index'] : '';
        if(isset($_COOKIE['index'])){
            $temTime = _COM_FLUD-(time()-$fludIndex);
            $info['error'] =  '<p class=txt9>Ошибка!<br>На сайте установлен флуд-контроль.';
            $info['error'] .= '<br>Вы не можете сейчас добавить комментарий.';
            $info['error'] .= '<br>У Вас осталось '.$temTime.' секунд.';
            setcookie('error',$info['error'],time()+60);
            // переход на страницу вывода комментариев
            header("Location: http://".$_SERVER['HTTP_HOST']."/comment.php");
            exit;
        }
        //************************************************
        $info['user_data'] = date("Y-m-d H:i:s");
        $info['user_ip'] = fGetIP();
        // сдесь можно добавить проверку по IP

        // запись в базу
        $z = "INSERT INTO `comment` (
                `id` ,
                `user_data` ,
                `user_com` ,
                `user_nik` ,
                `user_mail` ,
                `user_ip` )
            VALUES (
                '',
                '".$info['user_data']."',
                '".$info['user_com']."',
                '".$info['user_nik']."',
                '".$info['user_mail']."',
                '".$info['user_ip']."',
            )";
        $r = $baza->query($z);
        // флуд контроль
        setcookie('index', time() ,time()+_COM_FLUD);

        header("Location: http://".$_SERVER['HTTP_HOST']."/comment.php");
        exit;
    }
}


function validMail($mail){
//********************************************************************
// функция проверки адреса почты
// при ошибке возвращает ''
//********************************************************************
    $result = (preg_match('/[0-9A-Za-z._-]+@([0-9a-z_-]+\.)+[a-z]{2,4}/', $mail)==0)? '' : $mail ;
    return $result;
}
function fGetIP(){
//********************************************************************
// функция получения IP
//********************************************************************
    if ($ip = getenv("HTTP_CLIENT_IP")){
       return $ip;
    }
    if ($ip = getenv("HTTP_X_FORWARDED_FOR")){
       if ($ip == '' || $ip == "unknown"){
          $ip = getenv("REMOTE_ADDR");
       }
       return $ip;
    }
    if ( $ip = getenv("REMOTE_ADDR") ){
    return $ip;
    }
}
function sCommentAddForm($info){
//********************************************************************
// скин формы
//********************************************************************
    return <<<EOF
    <div align="center"><p>&nbsp;</p>
    <form method="post">
        <table border="0" cellpadding="10" width="100%">
            <tr valign="top">
                <td align="center" class="txt8">
                    <p>*Название<br><input name="name" type="text" value="{$info['name']}">
                    <p>*Ваш отзыв<br><textarea name="user_com" rows=7 cols=45>{$info['user_com']}</textarea>
                    <p>Ваше имя: <input name="user_nik" type="text" value="{$info['user_nik']}">
                    <p>Mail: <input name="user_mail" type="text" value="{$info['user_mail']}">

                    <p><input type="submit" value="Добавить" name="com">
                    <p class="txt4">*Эти поля обязательны для заполнения
                </td>
            </tr>
            <tr>
                <td></td>
                <td></td>
            </tr>
        </table>
    </form>
    </div>
EOF;
}

?>

comment.php
Код

<?php
/*********************************************************************
    Модуль для работы с комментарием
//*********************************************************************/
$content = modComment();

echo $content;

function modComment(){
// здесь получаешь и обрабатываешь комментарии как тебе угодно
// лично я все данные закидываю в массиа $info

    // обработка ошибки
    $info['error'] = (isset($_COOKIE['error'])) ? $_COOKIE['error'] : '';

    $result = sCommentMain($info);
            return $result;
}

function sCommentMain($info){
//******************************************************************
// форма для вывода кооментариев
//******************************************************************
    return <<<EOF
    <p align="center">{$info['error']}
    <hr>
    <p>тут всё остальное
    <hr>
    <p><a href="commentadd.php">Добавить комментарий</a>
EOF;
}
?>


В общем, комментировал как мог... Если будет не понятно, спрашивай


Это сообщение отредактировал(а) Gold Dragon - 1.5.2007, 10:48


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


Новичок



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

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



Вобщем собственно гря проблемы не вижу, делаем что то типа
Код

<input type="hidden" name="action" value="send">


 и в обработке проверяем

Код

if(!empty($_POST['action']))
{
        //выполняем обработку
       header ("location: $_SERVER[HTTP_REFERER]");
}


и все

Это сообщение отредактировал(а) Ravanger - 3.8.2007, 15:28
PM MAIL   Вверх
Anarki
Дата 5.8.2007, 14:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Что-то я не понял, каким боком тут unset($act); поможет?
будет каждый раз уничтожаться и всё. Или я что-то недопонимаю?

Это сообщение отредактировал(а) Anarki - 5.8.2007, 14:44


--------------------
PM WWW   Вверх
Страницы: (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.

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


 




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


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

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