Перейти к содержимому

Реферальная программа Мегаплана

Партнерская программа Kredov

Как сделать форму и её обработчик в одном файле?

#1 Banderas

Banderas
  • Пользователь
  • 1 168 сообщений
  • Репутация: 1
0

Отправлено 10 Июнь 2011 - 18:29

Хочу что бы в одном файле были формы и обрабатывался запрос на добавление комментария. Как мне это сделать?
<form action='add_comment.php?' method='get'>
Ваше имя: <br/><input type='text' name='author' /><br/>
E-mail: <br/><input type='text' name='mail' /><br/>
Текст комментария:<br/>
<textarea name='text' rows='8' cols='30'>
</textarea><br/>
<input type='button' name='ok' value='Отправить'/><br/>
</form>

<?php
!isset($_GET['ok']) ? die('кнопка Отправить не нажата'): '';
$data = array($_GET['text'], $_GET['author'], $_GET['mail'], date(Ymd));

 

 

  • 0


robot

robot
  • Пользователь PRO
  • 2 652 сообщений
  • Репутация: 85
Советую обратить внимание на следующее:
  1. Помогите сделать почтовую форму
  2. Обработка большого текстового файла
  3. Помогите с обработкой выбора в форме
  4. Как сделать форму заказа html?
  5. PHP обработчик формы обратной связи

#2 yury

yury
  • Пользователь
  • 629 сообщений
  • Репутация: 176

Отправлено 10 Июнь 2011 - 21:31

Banderas,
твой код править лень. ;) Просто покажу свой, где запрос и обработка живут в одном файле.
Он короткий и простой, разобраться и сделать так же у себя — легко.
Суть такая:
* мы знаем, что в нашей форме обработчику передается некое значение
* если мы в первый раз вызываем обработчик, то через форму ничего не передавалось, поэтому достаточно проверить установлено ли это значение в массиве переданных переменных (в моем примере — это $_POST['utime']), сделать это можно функцией isset() или, как у меня, заодно проверить правильность формата переданных данных (у меня должно быть передано число, поэтому используется функция is_numeric())
* ну а затем, в зависимости от результата проверки, выбираем дальнейшие действия

Файл utime.php
Пересчитывает UNIX-время в дату по МСК — либо введенное в форму либо текущее (если в первый раз вызван или была введена ерунда, непохожая на цифру).
И пишет эту дату по-англ. и по-русски

<?php
$ut = is_numeric($_POST['utime']) ? $_POST['utime'] : time();
?>
<form action="utime.php" method="post">
<input type="text" name="utime" value="<?php
echo $ut;
?>" />
<input type="submit" value="пересчитать UNIX-время в дату по МСК" />
</form>
<?php
$ru_month = array("января","февраля","марта","апреля","мая","июня","июля","августа","сентября","октября","ноября","декабря");
$ru_day = array("воскресенье","понедельник","вторник","среда","четверг","пятница","суббота");

$wday = date("w",$ut);
$month = date("n",$ut)-1;
$r_wday = $ru_day[$wday];
$r_month = $ru_month[$month];
echo date("l, F j, Y, H:i:s",$ut) . "<br />";
echo $r_wday . ", " . date("j",$ut) . " " . $r_month . date(" Y г., H:i:s",$ut);
?>


  • 0

#3 Banderas

Banderas
    Topic Starter
  • Пользователь
  • 1 168 сообщений
  • Репутация: 1

Отправлено 11 Июнь 2011 - 09:57

Что то я толком не понял :D
вот так надо сделать? метод передачи обязательно POST?
<?php
$art_id = isset($_POST['id']) ? $_POST['id'] : '';
?>
<form action='add_comment.php?' method='post'>
E-mail: <br/><input type='text' name='mail' /><br/>

<input type='hidden' name='art_id' value="<?php echo $art_id; ?>"/> // та самая важная строка

<input type='button' name='ok' value='Отправить'/><br/>
</form>

<?php
!isset($_GET['ok']) ? die('кнопка Отправить не нажата'): print('form sent sucssesful');
$data = array($_POST['text'], $_POST['author'], $_POST['mail'], date(Ymd));

  • 0


#4 yury

yury
  • Пользователь
  • 629 сообщений
  • Репутация: 176

Отправлено 11 Июнь 2011 - 12:37

Banderas,
индекс массива $_POST соответствует значению параметра name в поле ввода.
Т.е. чтобы посмотреть что нам передано через это поле ввода

<input type='text' name='mail' />
следует использовать $_POST['mail']
а через это поле
<input type='hidden' name='art_id' value="<?php echo $art_id; ?>"/>
следует использовать $_POST['art_id']
и т.д.
В поле value обычно помещается значение, которое будет показано в данном поле сразу после загрузки страницы, или, если наше поле скрытое (type='hidden'), то таким образом можно передавать значения обрабатывающему скрипту _после_ нажатия кнопки с type='submit' (которой в вашем коде, кстати, нету), т.е. строка html
<input type='hidden' name='art_id' value='123' />
поместит в $_POST['art_id'] значение 123, не отображая ничего на странице.
Вы уверены, что это поле должно быть скрытым?

Метод post обычно используется для передачи данных через поля форм (см пример выше), а метод get — через параметры в адресной строке (типа, index.php?mail=banderas@mail.ru&art_id=123, в этом случае получим в $_GET['mail']banderas@mail.ru, а в $_GET['art_id']123 ). Подробнее расспросите, хоть у яндекса, про разницу между этими методами: http://yandex.ru/yan...м...m=os&lr=219
Берем первую ссылку, читаем, что эти методы различаются:
* способом передачи данных post — через стандартный поток get — вместе с URL
* максимальным объёмом данных post — 8 Кб get — 256 байт
* кэшированием данных post — нет get — да
и делаем выводы о подходящем для нашего случая методе.


  • 0

#5 Arukard1

Arukard1
  • Пользователь
  • 193 сообщений
  • Репутация: 0

Отправлено 19 Июнь 2011 - 00:58

Помоему проще сделать через switch :D
Если что стукни, расскажу и покажу все
  • 0

#6 matroskin8

matroskin8
  • Пользователь PRO
  • 767 сообщений
  • Репутация: 143

Отправлено 19 Июнь 2011 - 11:00

Можно так, как ниже :D
Использованы сессии, в частности для того, чтобы решить проблему F5. В таблице БД 4 поля: id, author, mail, text. Все 3 поля формы обязательны к заполнению. Если какое-то из полей не должно быть обязательным - достаточно убрать строку с проверкой данного поля на пустоту. В общем, думаю, что ничего сложного нет, тем более, что добавлял комментарии к коду.
<?php
session_start();
mysql_connect("localhost", "root", "") or die("No connect to server");
mysql_select_db("test") or die("No select DB");

if($_POST['ok']){
$author = trim(mysql_real_escape_string($_POST['author']));
$mail = trim(mysql_real_escape_string($_POST['mail']));
$text = trim(mysql_real_escape_string($_POST['text']));
$error = ''; // переменная для ошибок

/* проверяем заполнение обязательных полей */
if(empty($author)) $error .= '<li>Не заполнено поле "Ваше имя"</li>';
if(empty($mail)) $error .= '<li>Не заполнено поле "E-mail"</li>';
if(empty($text)) $error .= '<li>Не заполнено поле "Текст комментария"</li>';
if(empty($error)){
// если в $error ничего не попало - все ок
$res = mysql_query("INSERT INTO `comment` SET
`author`='{$author}',
`mail`='{$mail}',
`text`='{$text}'");
if(mysql_affected_rows() > 0){
// если данные добавлены в БД
$_SESSION['res'] = 'Добавлено!';
header("Location: {$_SERVER['PHP_SELF']}");
exit;
}else{
// если данные не добавлены в БД
$_SESSION['res'] = 'Не добавлено!';
$_SESSION['author'] = $author;
$_SESSION['mail'] = $mail;
$_SESSION['text'] = $text;
header("Location: {$_SERVER['PHP_SELF']}");
exit;
}
}else{
//иначе - не заполнены все обязательные поля
$_SESSION['res'] = '<ul>' .$error. '</ul>';
$_SESSION['author'] = $author;
$_SESSION['mail'] = $mail;
$_SESSION['text'] = $text;
header("Location: {$_SERVER['PHP_SELF']}");
exit;
}
}
?>

<form method='post' action="">
Ваше имя: <br/><input type='text' name='author' value="<?php echo $_SESSION['author']; ?>" /><br/>
E-mail: <br/><input type='text' name='mail' value="<?php echo $_SESSION['mail']; ?>" /><br/>
Текст комментария:<br/>
<textarea name='text' rows='8' cols='30'><?php echo $_SESSION['text']; ?>
</textarea><br/>
<input type='submit' name='ok' value='Отправить'/><br/>
</form>
<?php
echo $_SESSION['res'];
session_unset();
session_destroy();
?>

  • 0


#7 FordogeN

FordogeN
  • Пользователь
  • 1 414 сообщений
  • Репутация: 0

Отправлено 19 Июнь 2011 - 17:54

Простейший способ

<?php
if(isset($_POST['name'])){
// Обработчик
}else{
// Здесь форма в которой есть поле <input type='text' name='name'>
}
?>

  • 0

Как настроить выдержку и диафрагму зеркального фотоаппарата



#8 Arukard1

Arukard1
  • Пользователь
  • 193 сообщений
  • Репутация: 0

Отправлено 20 Июнь 2011 - 01:25

Даже показали как обработать форму и избежать инъекций!! :D
  • 0

robot

robot
  • Пользователь PRO
  • 2 652 сообщений
  • Репутация: 85


Оформление форума – IPBSkins.ru