Организация вывода сообщений пользователю

krafty

new Exception
Организация вывода сообщений пользователю

Задался целью приукрасить свои скрипты. Например при успешном удалении новости выводится окошко алерт "Новость успешно удалена". При неудаче - соотв. сообщение.
Я пытался сделать так:
PHP:
function show_mess($text)
{
   echo "<script language = javascript>alert('".$text."')</script>";
}    
$news_id=$_GET['news_id'];
if (!mysql_query("DELETE FROM news WHERE id='".$news_id."'"))
 show_mess('Не удается удалить новость');
else
  show_mess('Новость успешно удалена');
этот код расположен в отдельном файле delete.php.
после удачной, или неудачной операции пользователя нужно перенаправлять обратно на страницу edit.php, с кот. был вызван delete.php.
хеадер после вывода сообщения уже не получится.
можно обойтись без отдельного файла - тогда edit.php нужно вызывать с параметрами: edit.php?del_id=10
PHP:
function show_mess($text)
{
   echo "<script language = javascript>alert('".$text."')</script>";
}   
$del_id=$_GET['del_id'];
if (isset($del_id))
   if (!mysql_query("DELETE FROM news WHERE id='".$del_id."'")) {
     show_mess('Не удается удалить новость');
     error_log("Не удается удалить новость: ".mysql_errno().", ".mysql_error());
    }  
    else show_mess('Новость успешно удалена');     
  }
запись удаляется, сообщение выводится. но проблема осталась. как теперь восстановить предыдущее состояние, т.е. загрузить edit.php с параметрами которые были в адресной строке до удаления

-~{}~ 13.09.05 17:51:

может дал мутное описание проблемы... вобщем может сделать так:
формирование ссылки "удалить":
'<a href="edit.php?del_id='.$f['id'].'&'$_SERVER[QUERY_STRING])">удалить<a></p>'
тобишь удаляется новость и снова загружается страница со всеми параметрами (т.е., например восстановятся результаты поиска - что мне и надо).

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

-~{}~ 13.09.05 18:06:

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

Фанат

oncle terrible
Команда форума
что-то я не понял.
а без алерта этого красивого, о котором юзер всю жизнь мечтал, у тебя всё работает? Возврат, куда надо действует?

-~{}~ 13.09.05 19:23:

1. как поступают в таких случаях.
судя по приведённому коду, ты что-то выводишь тогда же, когда и удаляешь.
Это неправильно.
Надо запомнить два очень простых правила
1. если запрос производит в базе какие-то изменения, то делать его только ПОСТом.
2. После поста всенда делается редирект браузера с помощью заголовка Location
 

Mozart

Новичок
Как выход Location можно сделать с жадержкой и после него вывести алерт...
 

krafty

new Exception
т.е. необходим вариант с отдельным скриптом delete.php?
я не могу понять как " делать его только ПОСТом" когда нажимаем на ссылку "удалить"?
 

Mozart

Новичок
<input type='submit' name='action' value='delete'>
<input type =hidden name =id value = ".$row['id'].">
разжевывать не хочется
 

Фанат

oncle terrible
Команда форума
т.е. необходим вариант с отдельным скриптом delete.php
совсем не обязательно.
я не могу понять как " делать его только ПОСТом" когда нажимаем на ссылку "удалить"?
очень просто. вместо ссылки сделать кнопку =)

-~{}~ 13.09.05 19:49:

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

krafty

new Exception
алерт нужен, но только для случая, когда не удается удалить.

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

Я вот не пойму как решается проблема с восстановлением предыдущего состояния адресной строки. Ее все равно нужно передавать (только в случае с кнопкой в хидден поле).

И еще один вопрос, можешь объяснить, чем чревато использование GET в этом случае.
 

Фанат

oncle terrible
Команда форума
Ее все равно нужно передавать (только в случае с кнопкой в хидден поле).
зачем в хиддене? а экшен формы тебе чем не угодил? ;-)
можешь объяснить, чем чревато использование GET в этом случае.
любой бот, который случайно зайдёт на твою страничку...
 

krafty

new Exception
подытожим сказанное и предложенное ;-)
PHP:
//обработка формы
if (isset($_POST['del'])) {
  if (!mysql_query("DELETE FROM news WHERE id='".$news_id."'")) 
    $cant_del=1;
}

//сама форма
<form name="form1" method="post" action="<?=$_SERVER["SCRIPT_NAME"]."?".$_SERVER[QUERY_STRING]?>">
<input name="del" type="button" id="del" value="удалить">
</form>

//в нужно месте пишем
if ($cant_del) show_mess('Не удается удалить новость');
Куча вопросов:
-смысл писать строку в action формы если можно сделать локейшн.
-а как же все-таки передавай id, если "в форме хидден нафиг не нужен"
 

Фанат

oncle terrible
Команда форума
если можно сделать локейшн.
ну-ка поподробнее про локейшен.
с примером, если можно
как же все-таки передавай id, если "в форме хидден нафиг не нужен"
что-то я не подумал
хотел предложить передавать в value кнопки, а сейчас понял, что это будет некрасиво.
да, придётся хидден писать

-~{}~ 13.09.05 20:52:

//в нужно месте пишем
if ($cant_del) show_mess('Не удается удалить новость');
не понял.
в каком таком нужном месте?
а локейшен как же?
 

krafty

new Exception
>ну-ка поподробнее про локейшен.
PHP:
//обработка формы 
if (isset($_POST['del'])) { 
  if (!mysql_query("DELETE FROM news WHERE id='".$news_id."'")) 
   header("Location: $_SERVER["SCRIPT_NAME"]?$_SERVER[QUERY_STRING]&cant_del=1")
} 

//сама форма 
<form name="form1" method="post" action="<?=$_SERVER["SCRIPT_NAME"]?>"> 
<input name="del" type="button" id="del" value="удалить"> 
</form> 

//в нужно месте пишем 
if ($_POST['cant_del']) show_mess('Не удается удалить новость');
>любой бот, который случайно зайдёт на твою страничку
разве хакер не сможет добраться и до пост данных и изменить их

-~{}~ 13.09.05 19:59:

>не понял.
>в каком таком нужном месте?
>а локейшен как же?

стоп. локейшн используем только в случае невозможности удаления чтоли. ты меня запутал
 

Mozart

Новичок
Автор оригинала: Фанат
Mozart
про задержку ты совсем глупость сморозил, а в форме хидден нафиг не нужен.
иди учи матчасть. и на подольше там задержись.
Всмысле не локейшн...у меня например вот так есть
header( 'refresh: 3; ' );
echo "";
exit;
Так тоже неправильно?
 

Фанат

oncle terrible
Команда форума
смысл писать строку в action формы если можно сделать локейшн.
header("Location: $_SERVER["SCRIPT_NAME"]?$_SERVER[QUERY_STRING]&cant_del=1")
откуда ты возьмёшь квери стринг, если перед её не было в экшен?
>любой бот, который случайно зайдёт на твою страничку
разве хакер не сможет добраться и до пост данных и изменить их
бот - это не хакер.
это программа, которая скачивает/индексирует твою страничку.
>не понял.
>в каком таком нужном месте?
>а локейшен как же?
стоп. локейшн используем только в случае невозможности удаления чтоли. ты меня запутал
локейшен делается ВСЕГДА ПОСЛЕ ПОСТА.
твои формы, сообщения, яваскрипты - дело десятое.

какая разница - в случае невозможности или вседозволенности?
если у тебя был локейшен, то откуда у тебя $_POST возьмётся?

-~{}~ 13.09.05 21:24:

Mozart
это дважды неправильно.
принципиально, поскольку оставит в браузере страницу, на которой он постоянно будет спотыкатьсмя при перемещении по хистори "Невозможно отобразить страницу без повторной отправки данных бла бла"

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

krafty

new Exception
>бот - это не хакер
сорри за неосведомленность

PHP:
if (isset($_POST['del'])) { 
  mysql_query("DELETE FROM news WHERE id='".$news_id."'")
   header("Location: $_SERVER["SCRIPT_NAME"]?$_SERVER[QUERY_STRING]") 
} 

<form name="form1" method="post" action="<?=$_SERVER["SCRIPT_NAME"]."?".$_SERVER[QUERY_STRING]?>"> 
<input name="del" type="button" id="del" value="удалить"> 
</form>
схема такая:
нажимаем на кнопку - обработка формы - локейшн

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

krafty

new Exception
Фанат
спасибо, буду воплощать в жизнь.
я просто восхищаюсь твоему способу ответа на вопрос - наталкивать на мысль. т.е. чтобы человек в результате исходник сам написал, учитывая твои советы. это в тыщу раз эффективнее, чем дать прямой ответ.
 
Сверху