Jump to content
  • 0

Защита от автообновления


rus
 Share

Question

Добрый день!

Подскажите пожалуйста, как кроме header: location можно избавиться от автообновления и добавления инфы в базу?

Есть вот такой код:

<?php
if ($_GET['title'] == '' || $_GET['small_text'] == '' || $_GET['full_text'] == '')
{
echo "<h1>Вы ввели не всю информацию, поэтому она не может быть добавлена в базу!</h1>";
}
else
{
$result = mysql_query ("INSERT INTO pages (title,small_text,full_text) VALUES ('$title','$small_text','$full_text')");
if ($result == 'true')
{
echo "<h1>Информация успешно занесена в базу!</h1>";
}
else
{
echo "<p>Ошибка в скрипте! Информация не добавлена!</p>";
}
}
?>

Если обновить страницу, то инфа опять занесется в базу.

Edited by rus
Link to comment
Share on other sites

Recommended Posts

  • 0
Добавь в сессию переменную которая будет переключаться при успешном добавлении

Можно немного поподробнее?

Я пробовал уничтожать переменную, при помощи unset но че-то не срабатывает.

То есть, мне нужно еще создать дополнительную строку в таблице бд типа: blabla_id и делать проверку что-то типа:

if (isset($_SESSION['blabla_id']))
{
тут что?
}

Edited by rus
Link to comment
Share on other sites

  • 0

к примеру:

$_SESSION['flag']=false;

if (!$_SESSION['flag']) {
$result = mysql_query ("запрос");

if ($result == true)
{
echo "<h1>Информация успешно занесена в базу!</h1>";
$_SESSION['flag']=true;
}

}

Мож чё напутал но логика такая

Добавил: причём здесь БД ? Мы о сессиях говорим

Ещё добавил: if ($result == 'true') - так не сравнивай, убери кавычки, а то у тебя получается не boolen, а string

Edited by LunatiK
Link to comment
Share on other sites

  • 0
Добавил: причём здесь БД ? Мы о сессиях говорим

Ещё добавил: if ($result == 'true') - так не сравнивай, убери кавычки, а то у тебя получается не boolen, а string

1) Но ведь в таблице так же можно создать доп. поле по которому можно проверять как по сессионной переменной, или я ошибаюсь?

2) А разве в результ не строка попадает?

По коду не получилось, так как заносит даже пустое значение.

Link to comment
Share on other sites

  • 0
1) Но ведь в таблице так же можно создать доп. поле по которому можно проверять как по сессионной переменной, или я ошибаюсь?

А зачем нам лишние запросы гонять ?

2) А разве в результ не строка попадает?

Возвращает link_identifier в случае успеха, и false в случае ошибки

link_identifier - равен истине но не равен строке 'true'

Описание

resource mysql_query ( string query [, resource link_identifier] )

mysql_query() посылает запрос активной базе данных сервера, на который ссылается переданный указатель. Если параметр link_identifier опущен, используется последнее открытое соединение. Если открытые соединения отсутствуют, функция пытается соединиться с СУБД, аналогично функции mysql_connect() без параметров. Результат запроса буфферизируется.

По коду не получилось, так как заносит даже пустое значение.

Код не вижу сказать ничего не могу

Link to comment
Share on other sites

  • 0
Обычно от этого защищаются промежуточной редирект-страницей.

Сообщение #1

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

Да редирект лучше, но человек хочет по-другому.

Edited by LunatiK
Link to comment
Share on other sites

  • 0
Обычно от этого защищаются промежуточной редирект-страницей.

То есть, создаю страницу на которую редиректю, а с нее обратно на изначальную так?

Да редирект лучше, но человек хочет по-другому.

А чем лучше?

Edited by rus
Link to comment
Share on other sites

  • 0
То есть, создаю страницу на которую редиректю, а с нее обратно на изначальную так?

На которую отправляешь данные формы, а с неё в зависимости от пожеланий можешь редиректить и обратно и куда тебе придумается

А чем лучше?

Возможностей больше, для меня например и логика прослеживается нежели замуты с if'ами и проверками.

отдал на страницу обработчик она своим классом всё сделала и решила либо обратно либо на страницу с информацией

+ разделение html c php

Link to comment
Share on other sites

  • 0
На которую отправляешь данные формы, а с неё в зависимости от пожеланий можешь редиректить и обратно и куда тебе придумается

У меня все обрабатывается в одном файле гетом.

Link to comment
Share on other sites

  • 0

И твой вариант имеет право жить. Я ж не сказал что это неправильно или отстойно.

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

Link to comment
Share on other sites

  • 0
И твой вариант имеет право жить. Я ж не сказал что это неправильно или отстойно.

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

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

Все тестится пока что на локалхосте.

По поводу:

Код не вижу сказать ничего не могу

В самом начале идет такой код:

<?php
session_start();
$_SESSION['flag']=false;

Далее:

<?php
if (!$_SESSION['flag']) {
$result = mysql_query ("INSERT INTO pages (title,small_text,full_text) VALUES ('$title','$small_text','$full_text')");
if ($result == true)
{
echo "<h1>Информация успешно занесена в базу!</h1>";
$_SESSION['flag']=true;
}
}
else
{
echo "<h1>Ошибка в скрипте! Информация не добавлена!</h1>";
}
?>

Не пашет... может я чего не догоняю?

Объясни пожалуйста если есть возможность и желание, если нет - ничего страшного. :)

Link to comment
Share on other sites

  • 0

Я не вкурсе как у тебя php настроен, поэтому хорошоб проверить зарегистрированна ли у тебя эта переменная

if (session_is_registered('flag')) {Echo "Переменная зарегистрированна"} ELSE {session_register('flag'); }

Link to comment
Share on other sites

  • 0
Я не вкурсе как у тебя php настроен, поэтому хорошоб проверить зарегистрированна ли у тебя эта переменная

if (session_is_registered('flag')) {Echo "Переменная зарегистрированна"} ELSE {session_register('flag'); }

Зарегистрирована, я в первую очередь об этом подумал.

Edited by rus
Link to comment
Share on other sites

  • 0

хм...

а так еси ?

if ($_SESSION['flag']==false) {
$result = mysql_query..........

тьфу ты блин у тяж при перезагрузке она в

<?php
session_start();
$_SESSION['flag']=false;

Сделай что если она есть и true чтоб не false'илась

Link to comment
Share on other sites

  • 0
Сделай что если она есть и true чтоб не false'илась

Эмм... не совсем понял, типа этого?

session_start();
$_SESSION['flag']=false;


if (!$_SESSION['flag']==true)
{
$result = mysql_query ("INSERT INTO pages (title,small_text,full_text) VALUES ('$title','$small_text','$full_text')");
if ($result == true)
{
echo "<h1>Информация успешно занесена в базу!</h1>";
$_SESSION['flag']=true;

Заносит пустые значения.

Link to comment
Share on other sites

  • 0

Интересное решение писать в флаг TRUE или FALSE, но ИМХО дурацкое, потому что ели человек один раз заполнил форму и хочет заполнить второй раз другими значениями, то ему покажут кукиш, так как флаг уже выставлен в TRUE. Ну либо надо где-то обнулять этот флаг, что тоже не удобно.

Вариант, который использую я:

 if(isset($_SESSION['lastPostHash']) && $_SESSION['lastPostHash'] == md5($_GET['title']. $_GET['small_text'].$_GET['full_text'])){

// ругаемся на мультипост

}
else{

// всё круто, обрабатываем форму дальше
// и ставим (обновляем) флаг
$_SESSION['lastPostHash'] == md5($_GET['title']. $_GET['small_text'].$_GET['full_text']);

}

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

Link to comment
Share on other sites

  • 0

Вот ещё так можно, но это от случайного нажатия F5

function WriteData()
{
if (isset($_SESSION['LastInsertion']) && (time()-$_SESSION['LastInsertion'] < 60)) return 'А минута ещё не прошла';
else sql::add("blablabla");
.....
$_SESSION['LastInsertion']=time();
}

И ещё вариант: отправлять все данные ajax'ом, а при получении успешного ответа, очищать данные формы. Я сейчас по работе пишу сайтик, там так сделал.

Edited by Int
Link to comment
Share on other sites

  • 0

session_start();
$_SESSION['flag']=false;

//Вот тут у тебя всегда flag=false , потому что присваевается, соответственно и следующее условие всегда истинно
//Либо его убирай либо проверяй его значение перед присваеванием.
if (!$_SESSION['flag']==true)
{
$result = mysql_query ("INSERT INTO pages (title,small_text,full_text) VALUES ('$title','$small_text','$full_text')");
if ($result == true)
{
echo "<h1>Информация успешно занесена в базу!</h1>";
$_SESSION['flag']=true;

@LEXXX_NF, вы правы, но нам же ни кто не сказал какого рода эта форма. Ваш вариант тоже имеет недостаток, а что если значение форм одинаковые ?

У товарища Int, более надёжное решение. Как идею его и рекомендую, а временную разницу выбирайте на своё усмотрение.

P.S. Ajax не спасает от двойного нажатия на кнопку, поэтому его как раз в идеале с функцией времени нужно использовать

Link to comment
Share on other sites

  • 0
@LEXXX_NF, вы правы, но нам же ни кто не сказал какого рода эта форма. Ваш вариант тоже имеет недостаток, а что если значение форм одинаковые ?

У товарища Int, более надёжное решение. Как идею его и рекомендую, а временную разницу выбирайте на своё усмотрение.

P.S. Ajax не спасает от двойного нажатия на кнопку, поэтому его как раз в идеале с функцией времени нужно использовать

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

Link to comment
Share on other sites

  • 0

Как здорово что есть несколько примеров, есть что выбрать.

Я в начале не пояснил для чего мне все это нужно и возможно задача отчасти из-за этого приобрела хаотичный вид...

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

К стати, если я иду не тем путем, может скажете?

И еще, чпу для основного меню решил сделать на php, без использования модреврайт, путем преобразования русских букв в латиницу, введенных в форму при указании название раздела, насколько правильный этот метод? Есть у него недостатки?

Edited by rus
Link to comment
Share on other sites

  • 0
session_start();
$_SESSION['flag']=false;

//Вот тут у тебя всегда flag=false , потому что присваевается, соответственно и следующее условие всегда истинно
//Либо его убирай либо проверяй его значение перед присваеванием.
if (!$_SESSION['flag']==true)
{
$result = mysql_query ("INSERT INTO pages (title,small_text,full_text) VALUES ('$title','$small_text','$full_text')");
if ($result == true)
{
echo "<h1>Информация успешно занесена в базу!</h1>";
$_SESSION['flag']=true;

Вобщем твой вариант не пашет, что я не так делаю?

Ошибку выводит что нет данных, но при этом все равно заносит инфу в бд.

$_SESSION['flag']=false;
if ($_SESSION['flag']==false)
{
if ($_GET['title'] == '' || $_GET['small_text'] == '' || $_GET['full_text'] == '')
echo 'нет данных';
$_SESSION['flag']=false;
}

if (!$_SESSION['flag']==true)
{
$result = mysql_query ("INSERT INTO pages (title,small_text,full_text) VALUES ('$title','$small_text','$full_text')");
if ($result == true)
{
echo "<h1>Информация успешно занесена в базу!</h1>";
$_SESSION['flag']=true;
}
}
else
{
echo "<h1>Ошибка в скрипте! Информация не добавлена!</h1>";
}

Буду пробовать другие варианты...

Edited by rus
Link to comment
Share on other sites

  • 0

Тоже не пашет:

if(isset($_SESSION['lastPostHash']) && $_SESSION['lastPostHash'] == md5($_GET['title']. $_GET['small_text'].$_GET['full_text'])){
echo 'не обновляйте страницу';
}
else{
$result = mysql_query ("INSERT INTO pages (title,small_text,full_text) VALUES ('$title','$small_text','$full_text')");
if ($result == true)
{
echo '<h1>Информация успешно занесена в базу!</h1>';
}
$_SESSION['lastPostHash'] == md5($_GET['title']. $_GET['small_text'].$_GET['full_text']);
}

Вариант Int немного не понял :)

Так же пробовал что-то типа такого:

if (!isset($_SESSION['flag']) || $_SESSION['flag']==false) {
$result = mysql_query ("INSERT INTO pages (title,small_text,full_text) VALUES ('$title','$small_text','$full_text')");
if ($result == true)
{echo "<h1>Информация успешно занесена в базу!</h1>";}
$_SESSION['flag'] = true;
}
else{
if ($_GET['title'] == '' || $_GET['small_text'] == '' || $_GET['full_text'] == '')
echo 'нет данных';
}

Тоже немного не то...

Еще раз попробую объяснить:

В общем есть форма, данные которой отправляются гетом и естесственно при этом, все что попало в переменные title, small_text, full_text, будут храниться в строке браузера и при обновлении страницы, они повторно попадают в бд. Вот как этого избежать? Так же конечно надо сделать проверку на пустые переменные, если они есть, то уничтожаем их, это я в принципе сделал.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy