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

Форум PHP

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

 

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

вид форума:
Линейный форум Структурный форум

тема: Запрет на обнавление обработчика... ?
 
 автор: Dinya_1   (30.11.2008 в 12:14)   письмо автору
 
 

После добавление инфы, обработчик выводит сообщение типа: "Сообщение успешно добавленно".
Если пользыватеь обновит эту же страницу таже инфа снова добавится, автоматом...

Можноли установить запрет на обновление страницы обработчика, или же стоит сразу же перенаправлять пользователя на другую страницу и уже в ней выводить: - "Сообщение успешно добавленно".

  Ответить  
 
 автор: sl1p   (30.11.2008 в 13:42)   письмо автору
 
   для: Dinya_1   (30.11.2008 в 12:14)
 

сделать редирект туда же куда пользователь попадает после отправки формы, тобишь:

if($_POST['submit']) header("location:".$_SERVER['REQUEST_URI']);

  Ответить  
 
 автор: Dinya_1   (30.11.2008 в 14:01)   письмо автору
 
   для: sl1p   (30.11.2008 в 13:42)
 

>сделать редирект туда же куда пользователь попадает после отправки формы, тобишь:
>
>if($_POST['submit']) header("location:".$_SERVER['REQUEST_URI']);

Вторая часть ответа не очень понятна, можно по подробней...?

  Ответить  
 
 автор: sl1p   (30.11.2008 в 14:09)   письмо автору
 
   для: Dinya_1   (30.11.2008 в 14:01)
 

ну вообще пофиг куда, но нужно редиректнуть кудато чтобы сбросился $_POST, в данном случае просто обновляем..

Проверяете, как там у вас, отправлена ли форма, обновляем.

  Ответить  
 
 автор: Николай2357   (30.11.2008 в 14:28)   письмо автору
 
   для: Dinya_1   (30.11.2008 в 14:01)
 

Вообще немного не так. Не совсем пофиг куда :)) Если вернуть на ту же страницу, переменные сохранятся. Нужен дополнительный параметр. Поподробнее можно так:
<?
if($_POST['submit']) 
{
//Выполняеете код, заносите в базу или что там у Вас...

header("location:".$_SERVER['REQUEST_URI']."?rand=".rand(1,5000));
}
В качестве рандома желательно использовать что нибудь уникальное, хотя и так вероятность совпадения ничтожно мала.

  Ответить  
 
 автор: sim5   (30.11.2008 в 14:47)   письмо автору
 
   для: Николай2357   (30.11.2008 в 14:28)
 

Да не обязательно какое-то случайное значение, параметр вообще может не иметь его:
<?
if (isset($_GET['namevar'])) echo "Успешное обновление";
esle if ($_POST...) {
  
//запись и перенаправление
}

  Ответить  
 
 автор: Николай2357   (30.11.2008 в 15:03)   письмо автору
 
   для: sim5   (30.11.2008 в 14:47)
 

Дело привычки :)) Мне удобнее редирикт делать до вывода, дабы не оплашать случайно... А на счет уникальности, не совсем ясно. А если повторная отправка нужна, тоже не обязательно? У меня в редакторе очень много отправок с одной страницы, надо попробовать.Всегда был убежден, что нужен новый...

  Ответить  
 
 автор: sim5   (30.11.2008 в 15:35)   письмо автору
 
   для: Николай2357   (30.11.2008 в 15:03)
 

Редирект в данном случае (у автора) делается только один раз - после удачного приема формы и записи данных, больше необходимсоти в нем нет. После редиректа на сому себя (если), эта страница уже ничего не выполняет, с нее можно только уйти, так что значение совсем не важно. Что значит "в редакторе очень много отправок с одной страницы" я не понимаю. Можно одной и той же страницей поэтапно принимать данные из формы, тут можно передавать значения в параметре при редиректе, ну я бы передавал его скрытно (через сессию), но никак не случаный, иначе как можно было бы узнать на каком этапе передачи находтся форма.

  Ответить  
 
 автор: Николай2357   (30.11.2008 в 16:22)   письмо автору
 
   для: sim5   (30.11.2008 в 15:35)
 

Да, действительно, перемудрил наверное я. Мне казалось, если форму заполнить и отправить два раза подряд, третий редирикт вернет на вторую страницу и и ее уже можно будет мучать F5. У меня форма заполняется гораздо больше раз, чем три, так как это редактор... Я не проверял, править конечно смысла нет, но на будущее учту. Спасибо за науку.

  Ответить  
 
 автор: sim5   (30.11.2008 в 17:38)   письмо автору
 
   для: Николай2357   (30.11.2008 в 16:22)
 

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

  Ответить  
 
 автор: Dinya_1   (30.11.2008 в 21:27)   письмо автору
 
   для: sim5   (30.11.2008 в 17:38)
 

Не понимаю, в какую именно часть кода нужно вставить
if($_POST['button']) header("location:".$_SERVER['REQUEST_URI']);

Выдает следующую ошибку:
Cannot modify header information - headers already sent by (output started at w:\home\localhost\www\doska\add_form.php:30) in w:\home\localhost\www\doska\add_form.php on line 93


Обработчик

<?
include ("blocks/bd.php");
//Проверка на поддрежку глоб.переменных...
if (isset($_POST['id']))           {$id $_POST['id'];}
if (isset(
$_POST['title']))           {$title $_POST['title'];}
if (isset(
$_POST['text']))            {$text $_POST['text'];}
if (isset(
$_POST['gorod']))           {$gorod $_POST['gorod'];}
if (isset(
$_POST['name_klient']))     {$name_klient $_POST['name_klient'];}
if (isset(
$_POST['tel']))             {$tel $_POST['tel'];}
if (isset(
$_POST['nomer_asq']))       {$nomer_asq $_POST['nomer_asq'];}
if (isset(
$_POST['email']))          {$email $_POST['email'];}
if (isset(
$_POST['cat']))          {$cat $_POST['cat'];}
if (isset(
$_POST['nazv_razdela'])) {$nazv_razdela $_POST['nazv_razdela'];}
if (isset(
$_POST['nazvan']))          {$nazvan $_POST['nazvan'];}
if (isset(
$_POST['date']))            {$date $_POST['date'];}
if (isset(
$_POST['img']))          {$img $_POST['img'];}
if (isset(
$_POST['code']))         {$code=$_POST['code'];} 
if (isset(
$_POST['button']))         {$button=$_POST['button'];}   

<?
php             
/* Если существует в глобальном массиве $_POST['title'] опр. ячейка, то мы создаем простую переменную из неё. Если переменная пустая, то уничтожаем переменную.   */

if (isset($button))
{
if (isset(
$title)) {trim($title);   }
else {
$title "";}

if (isset(
$text)) {trim($text);   }
else {
$text "";}

if (isset(
$gorod)) {trim($gorod);   }
else {
$gorod "";}

if (isset(
$name_klient)) {trim($name_klient);   }
else {
$name_klient "";}

if (empty(
$title) or empty($text) or empty($gorod) or empty($name_klient) )
{
exit (
"<p>Вы ввели не всю информацию, вернитесь назад и заполните все поля.<br>
<a href=\"javascript:history.back()\">назад</a>"
);
}
/*Экранируем атаки злоумышлинников спец. функциями*/
//Функция обрезки введенных обратных слэшей ...
$title stripslashes($title);
$text stripslashes($text);
$gorod stripslashes($gorod);
$name_klient stripslashes($name_klient);
$tel stripslashes($tel);
$email stripslashes($email);
$nomer_asq stripslashes($nomer_asq);
$code stripslashes($code);
//Функция обрезки введенных тегов типа <strong></strong> т.д...
$title htmlspecialchars($title);
$text htmlspecialchars($text);
$gorod htmlspecialchars($gorod);
$name_klient htmlspecialchars($name_klient);
$tel htmlspecialchars($tel);
$email htmlspecialchars($email);
$nomer_asq htmlspecialchars($nomer_asq);
$code htmlspecialchars($code);
}
$result1 mysql_query ("SELECT sum FROM sum_setting",$db);
$myrow1 mysql_fetch_array($result1);
if (
$code == $myrow1["sum"])
{
$result mysql_query ("INSERT INTO forma (title,cat,text,gorod,name_klient,tel,nomer_asq,email,nazv_razdela,nazvan,date) 
VALUES '
$title','$cat','$text','$gorod','$name_klient','$tel',
'
$nomer_asq','$email','$nazv_razdela','$nazvan','$date')",$db);
if (
$result == 'true') {echo "Информация успешно добавленно"; }
else {echo 
"<p>Ваша информация Не добавлена</p>";}       
}
else
{
exit (
"<p>Вы ввели Неверную сумму с картинки, на предыдущей страице.<br>
<a href=\"javascript:history.back()\">назад</a> "
);
}

//Возврат id
$id mysql_insert_id();

$result3 mysql_query("SELECT url_2 FROM  url_mes WHERE id='1' ",$db);
$myrow3 mysql_fetch_array($result3); 
$result4 mysql_query("SELECT url_2 FROM  url_mes WHERE id='2' ",$db);
$myrow4 mysql_fetch_array($result4);
// Вывод полного адреса с учетом id
printf ("<div>Просмостреть сообщение можно перейдя по ссылке<br>%s".$id."<br>
<br>Удалить сообщение можно сдесь<br>%s"
.$id."</div>",$myrow3["url_2"],$myrow4["url_2"]);

?>

  Ответить  
 
 автор: Николай2357   (30.11.2008 в 22:21)   письмо автору
 
   для: Dinya_1   (30.11.2008 в 21:27)
 

header - это заголовок. то есть то, что отправляется клиенту перед формированием странички, что бы браузер знал, как именно ее формировать и что вообще делать. По этому, сначала нужно отправить все заголовки, а потов делать вывод информации. Если до функции header() есть функция echo или print или другой вывод, включая нотисы, то Вы получите данную ошибку. Даже пробел перед открывающим php тегом (<?) принимается за вывод. Так же эту щшибку можно получить, если есть есть пробел после закрывающего тега (?>) в файле, подключенном до отправки заголовка.
В вашем случае код нужно разделить на два блока. Один - прием и обработка информации, второй - вывод результата. Как то так:
<?
if(isset($_POST['submit'])// Имя кнопки отправки
{
if (isset(
$_POST['id']))           {$id $_POST['id'];}
.
.
.
.
.
$result mysql_query ("INSERT INTO forma (title,cat,text,gorod,name_klient,tel,nomer_asq,email,nazv_razdela,nazvan,date)  
VALUES '
$title','$cat','$text','$gorod','$name_klient','$tel', 
'
$nomer_asq','$email','$nazv_razdela','$nazvan','$date')",$db);
header(.....
exit();
}
// Тут вывод результатов.

  Ответить  
 
 автор: sim5   (01.12.2008 в 07:27)   письмо автору
 
   для: Dinya_1   (30.11.2008 в 21:27)
 

//Функция обрезки введенных тегов типа...
Функция htmlspecialchars() ничего не обрезает, вырезать html-теги может функция strip_tags().

if ($result == 'true')... else {echo "<p>Ваша информация Не добавлена</p>";}
И что из этого следует? Что дальше - радоваться или огорчаться пользователю от этого? Если произошел сбой записи в базу, то верните пользователю фому, и дайте ему возможность повторить запись.

javascript:history.back()...
Вы проверяете ошибки и выдаете их пользователю, так возвращайте ему форму с этими ошибками и уже с введенными данными, к чему это history. А еще, можно не использовать имена полей типа name, email, text и т.д., а именовать поля "случайно", меняя их при каждом выводе формы.

  Ответить  
 
 автор: Dinya_1   (01.12.2008 в 18:02)   письмо автору
 
   для: sim5   (01.12.2008 в 07:27)
 

Мда, функция htmlspecialchars(), не вырезает, а меняет теги на мнемоники...

По поводу ответа:" >А еще, можно не использовать имена полей типа name, email, text и т.д., а именовать поля "случайно", меняя их при каждом выводе формы."

А что это дает?

  Ответить  
 
 автор: sim5   (01.12.2008 в 18:03)   письмо автору
 
   для: Dinya_1   (01.12.2008 в 18:02)
 

>А что это дает?

Фигу для бота.

  Ответить  
 
 автор: Dinya_1   (01.12.2008 в 18:06)   письмо автору
 
   для: sim5   (01.12.2008 в 18:03)
 

А по точнее...

  Ответить  
 
 автор: sim5   (01.12.2008 в 18:09)   письмо автору
 
   для: Dinya_1   (01.12.2008 в 18:06)
 

А для чего каптча у вас? Для того чтобы не пропустить бота. А как бот работает? Да просто, запомнили html-код вашей формы, и в дальнейшем шлют вам автоматом лабуду всякую по статичным именам полей. А если имена полей с каждым выводом формы меняются, как вы думаете...?

  Ответить  
 
 автор: Dinya_1   (01.12.2008 в 18:18)   письмо автору
 
   для: sim5   (01.12.2008 в 18:09)
 

А можно пример кодирования, на смену полей...?,

И еще один вопрос, по перенапровлению: В примере "Николай2357" , показан "сброс" переменной Пост, прямо перед функцией добавления инфы в базу, и мне не понятно если её сбросить как же она добавится?
<? 
if(isset($_POST['submit'])// Имя кнопки отправки 

if (isset(
$_POST['id']))           {$id $_POST['id'];} 





$result mysql_query ("INSERT INTO forma (title,cat,text,gorod,name_klient,tel,nomer_asq,email,nazv_razdela,nazvan,date)   
VALUES '
$title','$cat','$text','$gorod','$name_klient','$tel',  
'
$nomer_asq','$email','$nazv_razdela','$nazvan','$date')",$db); 
header(..... 
exit(); 

// Тут вывод результатов. 

  Ответить  
 
 автор: sim5   (01.12.2008 в 18:48)   письмо автору
 
   для: Dinya_1   (01.12.2008 в 18:18)
 

Можно и пример. Можно его и упростить.

Суть всей кухни сброса POST данных от формы простая, я вам писал о ней выше, и всю эту суть можно выразить тремя строками. Разбейте свой код на три логических блока:
1. Окончание работы.
2. Прием и проверка данных.
3. Вывод формы по умолчанию и ошибках.
Так как механизм использует передачу заголовка, то нужно разделить вывод в браузер и передачу заголовка (перенаправление). Сделать это не сложно, даже, если перенаправление будет на саму себя. Действительно, после выдачи "ОК" пользователю, можно завершить работу скрипта - более то ничего не требуется. От сюда:
<?
//первый блок - окончание работы
//в этом блоке можно сделать и инициализацию переменных, например:
$name = isset($_POST['name']) ? $_POST['name'] : "";
$mail = isset($_POST['mail']) ? $_POST['mail'] : "";
if (isset(
$_GET['var'])) { //проверяем, было ли перенаправление
  
echo "All OK!";
  
//можно и завершить все
  
exit;
//второй блок - прием формы и проверка
} else if (isset($_POST['submit'])) {
  
//проверяем все поля формы
  
$error "";
  if (
$name...) ...
  if (
$mail ...) ...
  
//если все ОК, запись и переход
  
header("location : script.php?var"); 
}
//третий блок - вывод формы по умолчанию и ошибках
if (!isset($_GET['var']) || $error) {
  
//код формы, значениями полей которой служат
  //инициализированные переменные -
  //по умолчанию они пусты, при получении формы и возврате ошибок
  //будут содержать уже введенное пользователем  

  Ответить  
 
 автор: Dinya_1   (02.12.2008 в 18:56)   письмо автору
 
   для: sim5   (01.12.2008 в 18:48)
 

sim5 - написал красиво но коротко, кажется начинаю понимать что к чему, только не могу ни как разобрать что значить 'var' - тоже что и id ? типа порядкового номера?

также понятно насчет третьего блока...Сообщение об Ошибках с какой части будет выходить с первой или же со второй...?

  Ответить  
 
 автор: sim5   (02.12.2008 в 19:23)   письмо автору
 
   для: Dinya_1   (02.12.2008 в 18:56)
 

А вам что роман написать "Location, мать его ити"? :) Ну тогда это будет очень большое вступление о сомнениях и терзаниях душевных, большой заключительный пролог, а между ними всего одна полезная строк: - header("location: ...").
VAR - это имя переменной, которое вы можете заменить на любое другое. Я написал так потому, что это сокращение от variable - переменная.
Во втором блоке, вы проверяте данные полей пришедшей формы, и если какое либо поле имеет ошибки, то вы добавляете соответствующее сообщение переменной $error. Как добавлять, тут можно поступить по разному, например, сообщения об ошибках, это будут просто элементы параграфа с текстом ошибки в них, тогда при ошибках:
$error .= "<p>Error 1</p>"; и т.д.. Можно сделать текст ошибок массивом, и т.д., и т.п..
Теперь вывод формы, она будет (по условию) выводиться и при ошибках ввода. Значит, передав эту переменную в вывод формы, пользователь увидит сообщения.

  Ответить  
 
 автор: serjinio   (03.12.2008 в 07:44)   письмо автору
 
   для: sim5   (02.12.2008 в 19:23)
 

поэкспериментировал с динамической сменой полей формы и чтото не совсем понятно...

<?php session_start(); 
//функция создания случайных имен для полей формы
function formGet($name) {
  
$_SESSION['elemets_form'] = array();
  foreach(
$name as $val) {
    
$_SESSION['elemets_form'][$val] = md5(uniqid(rand(),1));
  }
  return 
$_SESSION['elemets_form'];
}
//генерируем случайные имена полей формы
$elm formGet(array("name","email","submit")); 
?>
<form action="<?php echo $_SERVER['PHP_SELF'?>" method="post">
Имя: <input type="text" name="<?php echo $elm['name'?>" value=""><br> 
e-mail: <input type="text" name="<?php echo $elm['email'?>"><br> 
<input name="<?php echo $elm['submit'?>" type="submit"  value="Отправить" />   
</form>
<?php 
echo '<pre>'
 
print_r ($_SESSION['elemets_form']);
echo 
'</pre>';
$elemets = &$_SESSION['elemets_form']; 
$name  =$_POST[$elemets['name']]; 
$name1  trim($_POST[$_SESSION['elemets_form']['name']]);  
echo 
'<br>name=='.$name;
echo 
'<br>name1=='.$name1;


получаю массив
Array
(
    [name] => b04029ae9bab46688c39327758a34b38
    [email] => ca7d9aef4b68a842c7d3fc53491a92a0
    [submit] => 363217f37b7996b61fb5266ebdff1bc9
)


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

  Ответить  
 
 автор: sim5   (03.12.2008 в 08:55)   письмо автору
 
   для: serjinio   (03.12.2008 в 07:44)
 

Потому, что ваш скрипт постоянно переназначает имена полей до их проверки. Запишите так:
<?
function formElemts($name$elements) {
  
//возможно придется обращаться к элеменам формы в JS,
  //а id элементов не должны начинаться с цифры,
  //поэтому будем добавлять к имени поля буквенный префикс
  
$s "qwertyupasdf";
  
$_SESSION[$name] = array();
  foreach(
$elements as $val) {
    
$_SESSION[$name][$val] = $s[rand(0,10)] ."_"md5(uniqid(rand(),1));
  }
  return 
$_SESSION[$name];
}
//если форма пришла, выводим
if (isset($_POST[$_SESSION['visit']['submit']])) {
  echo 
"<pre>"//пощелкайте несколько раз отправку
  
print_r($_POST); //это будет выводить вам массив POST
  
echo "</pre>"//постоянно с новыми именами полей формы
  
echo $_POST[$_SESSION['visit']['name']]."<br>".$_POST[$_SESSION['visit']['email']];
} else {
  
//формируем массив имен элементов формы здесь,
  //предотвращая их переименование при получении формы до проверки полей ее. 
  //будем именовать массивы элементов полей - в функцию передаем имя массива
  
$elm formElemts("visit", array("name","email","submit"));
}
?>  
<form action="<?php echo $_SERVER['PHP_SELF'?>" method="post"> 
Имя: <input type="text" name="<?php echo $elm['name'?>" value="as@as.as"><br>  
e-mail: <input type="text" name="<?php echo $elm['email'?>" value="name"><br>  
<input name="<?php echo $elm['submit'?>" type="submit"  value="Отправить" />    
</form>

После удачной обработки формы, удаляем массив имен. При реальной работе, проверям, установлен ли такой массив, если да - работа скрипта, если нет - то и дальнейшее проверять нет смысла.

  Ответить  
 
 автор: serjinio   (03.12.2008 в 23:14)   письмо автору
 
   для: sim5   (03.12.2008 в 08:55)
 

Спасибо Вам ,разобрался...пропускал цикл...
А можно попутно задать вопрос ...вот это &
$elemets = &$_SESSION['elemets_form'];

я как понимаю передача переменной по по ссылке,но не понимаю физический смысл этой передачи,в
частности используемой в функциях
function fs(&$var){$var++;}

в каких случаях & надо использовать,Заранее спасибо.

  Ответить  
 
 автор: Trianon   (03.12.2008 в 23:29)   письмо автору
 
   для: serjinio   (03.12.2008 в 23:14)
 

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

http://ru2.php.net/manual/ru/language.references.php

  Ответить  
 
 автор: sim5   (04.12.2008 в 06:16)   письмо автору
 
   для: serjinio   (03.12.2008 в 23:14)
 

То что разобрались, это хорошо, но если говорить о примере, который я показал выше, то он годиться только как тест-пример, не более, для реального сценария он не подойдет.
У меня ссылка используется просто для сокращения записей - при большом числе элементов формы и многочисленных проверках POST-данных, можно сразу прописать ссылки на каждый элемент массива, код получиться более читабельным. Trianon уже сказал где почитать, значит вы изучили вопрос этот.

  Ответить  
Rambler's Top100
вверх

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