пример обработки формы

StUV

Rotaredom
пример обработки формы

как принимать, обрабатывать и выводить форму.

вот пример обработки формы на примере формы для гостевой книги (без вывода оной, только заполнение)
который я считаю более-менее идеальным
PHP:
<? 
if ($_SERVER['REQUEST_METHOD']=='POST') { 
  //обрабатываем полученные переменные. 
  foreach($_POST as $key => $value) { 
    //сначала делаем обработку, которая не испортит данные, 
    //если их придется выводить в форму снова, при ошибке 
    $value=trim($value); // убираем пробелы в начале и в конце переменной. 
    if (get_magic_quotes_gpc()) $value = stripslashes($value); //убираем слеши, если надо 
    $value=htmlspecialchars($value,ENT_QUOTES); //заменяем служебные символы HTML на эквиваленты 
    $_POST[$key]=$value; //все изменения записываем в массив $_POST 
    //дальше делаем изменения, которые пойдут только в файл, 
    //а в форму их выводить не нужно. 
    $value=str_replace("\r","",$value); // заменяем все переводы строк 
    $value=str_replace("\n","<br>",$value); //на <br> 
    $msg[$key]=$value; //и присваиваем новые значения элементам массива $msg. 
  } 
  //дальше делаем разнообразные проверки. Они здесь для 
  //примера, вы можете добавлять, какие захотите 
  //главное то, что при любых ошибках переменная $err становится не пустой. 
  //то есть, она одновременно является и флагом ошибки и 
  //содержит все сообщения об ошибках. 
  $err=''; 
  if (!$name) $err.="Вы забыли написать свое имя<br>"; 
  if (!$notes) $err.="Вы забыли написать сам отзыв!<br>"; 
  if (strlen($name) > 30) $err.="Длина имени не может превышать 30 символов<br>"; 
  if (strlen($notes) > 1000) $err.="Длина отзыва не может превышать 1000 символов<br>"; 
  if (strlen($email) > 50) $err.="емейл длинноват...<br>"; 
  if (preg_match("/[0-9a-zA-Zа-яА-ЯЁё]{30,}/",$notes,$matches)) { 
    $err.="В отзыве присутствует слишком длинное слово ".$matches[0].". Cократите или разбейте его, пожалуйста."; 
  } 
  $email_ok=eregi("^([_\.0-9a-z-]+@)([0-9a-z][0-9a-z-]+\.)+([a-z]{2,4})$", $email); 
  if (!$email_ok && $email) $err.="Ошибка в емейле. Если не хотите, то просто не пишите!<br>"; 
  //если ошибок нет, то пишем в файл 
  if (!$err) { 
    $s=$msg['name']."|".$msg['email']."|".$msg['notes']."|".time()."\n"; 
    $fp=fopen("gbook.txt","a"); 
    fwrite($fp,$s); 
    fclose($fp); 
    //после записи перенаправляем браузер на страницу, 
    //которая отображает сообщения 
    Header("Location: ".$_SERVER['PHP_SELF']); 
    //и обязательно завершаем работу скрипта 
    exit; 
  } 
  //если у нас были ошибки при заполнении формы, то в файл 
  //ничего не запишется, скрипт не завершится, а выведется 
  //форма, с заполненными полями и сообщения об ошибках 
} else { 
  //если это не пост, то присваиваем переменным, выводимым 
  //в форме пустую строку 
  $_POST['name'] = $_POST['email'] = $_POST['notes'] =''; 
} 
?> 
<html> 
<head></head> 
<body> 
<? if ($err) echo '<font color=red><b>'.$err.'</b></font>'; ?> 
<form action="<? echo $_SERVER['PHP_SELF'] ?>" method="POST"><br> 
Name: <input type="text" name="name" value="<? echo $_POST['name'] ?>"><br> 
Email: <input type="text" name="email" value="<? echo $_POST['email'] ?>"><br> 
Notes: <textarea rows="3" cols="30" name="notes"><? echo $_POST['notes'] ?></textarea><br> 
<input type="submit" name="submit"> 
</form> 
</body> 
</html>
Как это работает?
При заходе на страницу выводится форма для заполнения.
после того, как человек заполнит форму и нажмет кнопку Послать, данные отсылаются тому же самому скрипту. скрипт определяет, что это ПОСТ, и начинает его обрабатывать.
проверяет все поля, и если все ОК, то записывает в файл.
Дальше, чтобы избежать повторной посылки данных, мы заставляем браузер запросить страницу, но уже без посылки данных формы.
Еще про это можно почитать здесь
http://tony2001.phpclub.net/faq/other.location.html

после такого запроса надо всегда ставить команду exit;
Если же проверка выявила ошибки, то скрипт продолжает выполняться, то есть форма выводится снова, но перед ней выводятся сообщения об ошибках, а сама форма заполнена тем, что вводил пользователь.

мда...
в результате всех поправок и добавлений, которые щедро несли всякие доброхоты, а я весело включал в скрипт, он стал совершенно нечитаемым...
вот его краткая схема.
PHP:
if ($_SERVER['REQUEST_METHOD']=='POST') { 
  foreach($_POST as $key => $value) { 
    //пробегая по массиву ПОСТ обрабатываем полученные переменные. 
  } 
  //дальше проверяем поля формы 
  if (!$err) { 
    //записываем и перенаправляем 
    Header("Location: ".$_SERVER['PHP_SELF']); 
    exit; 
  } 
} 
//выводим форму.
То есть, собственно ТО, ЧТО Я И ХОТЕЛ СКАЗАТЬ.
еще раз повторяю.
Это не пример ГОСТЕВОЙ КНИГИ. это не пример реальной гостевой книги.
Это пример работы с формой. простой работы с формой. как выводить, как обрабатывать.
 
Сверху