Home

11 Обробка форм

Для створення форми пртрібні як мінімум наступні елементи:

  • відкривачий та закриваючий теги - <form></form>
  • тип передачі даних, що задаються одним з двох методів - GET або FORM
  • одне або декілька полів для вводу даних
  • URL-адреса призначення, на яку будуть відправлені дані форми

Приклад 11.1. formtest.php простий обробник форми на PHP

"scripts/formtest.php"
<?php //formtest.php
echo <<<_END
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>Form Test</title>
</head>
<body>
  <form class="" action="formtest.php" method="post">
    Як Вас звати?
    <input type="text" name="name">
    <input type="submit">
  </form>

</body>
</html>
_END;
?>

Видобування відправлених даних

Приклад 11.2. Оновлена версія formtest2.php

"scripts/formtest2.php"
<?php //formtest.php

if (isset($_POST['name'])) $name = $_POST['name'];
else $name = "(Не введено)";

echo <<<_END
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>Form Test</title>
</head>
<body>
  Вас звати: $name<br>
  <form class="" action="/learn/shablon/scripts/formtest2.php" method="post">
    Як Вас звати?
    <input type="text" name="name">
    <input type="submit">
  </form>

</body>
</html>
_END;
?>
Результат виконання коду:

Form Test Вас звати: (Не введено)
Як Вас звати?

Текстове поле

<input type="text" name="имя" size="размер" maxlength="длина" value="значение">

Текстова область

<textarea name="имя" cols="ширина" rows="высота" wrap="тип">
    Это текст, отображаемый по умолчанию.
    </textarea>
  
  • Якщо не вказувати значення атрибута wrap, буде задіяний м'який варіант переносу.
Типи переноса, доступні в області введення <textarea> (wrap)
Тип Дія
off Текст не переноситься, і рядки з'являються в суворій відповідності з тим, як їх вводить користувач
soft Текст переноситься, але відправляється на сервер одним довгим рядком без символів повернення каретки і переведення рядка
hard Текст переноситься і відправляється на сервер в форматі перенесення з «м'яким» поверненням в початок наступного рядка і переведенням рядка

Флажки

<input type="checkbox" name="имя" value="значение" checked="checked">
Я согласен <input type="checkbox" name="agree">
Я согласен
Я согласен <input type="checkbox" name="agree" value="1">
Я согласен

Пример 11.4. Предложение сделать выбор, установив сразу несколько флажков

Ванильное <input type="checkbox" name="ice" value="Vanilla">
  Шоколадное <input type="checkbox" name="ice" value="Chocolate">
  Земляничное <input type="checkbox" name="ice" value="Strawberry">
Ванильное Шоколадное Земляничное

Якщо встановлений тільки один прапорець, наприклад другий, то буде переданий тільки цей елемент (полю з ім'ям ice буде присвоєно значення Шоколадне). Але якщо будуть обрані два і більше прапорця, буде відправлено тільки останнє значення, а всі попередні будуть проігноровані.

Приклад 11.5. Надсилання декількох значень за допомогою масиву

    Ванильное <input type="checkbox" name="ice[]" value="Vanilla">
    Шоколадное <input type="checkbox" name="ice[]" value="Chocolate">
    Земляничное <input type="checkbox" name="ice[]" value="Strawberry">
  

витягти в змінну або окреме значення, або масив значень:

$ice = $_POST['ice'];

Якщо змінна $ice є масивом, то для відображення її вмісту можна використовувати дуже простий PHP-код:

foreach($ice as $item) echo "$item<br>";

Приклад 11.6. Використання перемикачів

     8.00-12.00<input type="radio" name="time" value="1">
    12.00-16.00<input type="radio" name="time" value="2" checked="checked">
    16.00-20.00<input type="radio" name="time" value="3">
  
     8.00-12.00
    12.00-16.00
    16.00-20.00
  

Приховані поля

echo '<input type="hidden" name="submitted" value="yes">'
  

Існування цього поля можна легко перевірити за допомогою наступного коду:

if (isset($_POST['submitted']))
  {...
  

<select>

    Пример 11.7. Использование поля со списком
    Овощи <select name="veg" size="1">
    <option value="Горох">Горох</option>
    <option value="Фасоль">Фасоль</option>
    <option value="Морковь">Морковь</option>
    <option value="Капуста">Капуста</option>
    <optio<n< value="Брокколи">Брокколи</option>
    </select>

Пример 11.7. Использование поля со списком Овощи

    Пример 11.8. Использование select с атрибутом multiple
    Овощи <select name="veg" size="5" multiple="multiple">
    <option value="Горох">Горох</option>
    <option value="Фасоль">Фасоль</option>
    <option value="Морковь">Морковь</option>
    <option value="Капуста">Капуста</option>
    <optio<n< value="Брокколи">Брокколи</option>
    </select>
    

Пример 11.8. Использование select с атрибутом multiple Овощи

При визначенні поля зі списком, що працює в режимі множинного вибору, можна також скористатися атрибутом selected для завдання при необхідності більш одного заздалегідь обраного варіанту.

Теги label

Повертаючись до прикладу вибору часу доставки, можна дозволити користувачеві клацати як на самому перемикачі, так і на пов'язаному з ним тексті:

<<label>8.00-12.00<input type="radio" name="time" value="1">

Кнопка відправки

Щоб узгодити текст на кнопці відправки з різновидом відправляємої форми, його можна змінити на свій розсуд, скориставшись атрибутом value:

<Input type = "submit" value = "Пошук">

Можна також замінити стандартний текст на кнопці обраним вами графічним зображенням, використовуючи наступний код HTML:

<input type = "image" name = "submit" src = "image.gif">

Знешкодження введених даних

не варто довіряти будь-якій змінній, витягнутій з масиву $_GET або $_POST, до тих пір, доки вона не пройде відповідну обробку.

щоб запобігти впровадження escape-символів в рядок, який буде представлений ​​MySQL:

$variable = $connection->real_escape_string($variable);

Щоб позбутися від небажаних слеш-символів:

$variable = stripslashes($variable);

для видалення з рядка будь-якого HTML-коду:

$variable = htmlentities($variable);

якщо потрібно повністю очистити введені дані від HTML:

$variable = strip_tags($variable);

Нижче в прикладі 11.9. показані дві функції, в яких зібрані разом всі ці обмеження, що забезпечують досить високий рівень безпеки.

Приклад 11.9. Функції sanitizeString і sanitizeMySQl

    <?php function sanitizeString($var)
    {
      $var = stripslashes($var);
      $var = strip_tags($var);
      $var = htmlentites($var);
      return $var;
    }

    function sanitizeMySQl($connection, $var)
    {
      $var = $connection->real_escape_string($var);
      $var = sanitizeString($var);
      return $var;
    }
     ?>
  

Додати цей код в останні рядки своїх програм, і тоді можна викликати його для знешкодження всіх даних що вводяться користувачами:

$var = sanitizeString($_POST['user_input']);

або, якщо є відкрите підключення до MySQL і об'єкт підключення mysqli (який в даному випадку називається $connection):

$var = sanitizeMySQL($connection, $_POST['user_input']);
Якщо використовується процедурна версія розширення mysqli, потрібно буде змінити функцію sanitizeMySQL для виклику функції mysqli_real_escape_string, отримавши приблизно такий код (В цьому випадку $connection буде не об'єктом, а описувачем):
$var = mysqli_real_escape_string($connection, $var);

Приклад програми

Приклад 11.10. Програма перевода значень між шкалами Фаренгейта і Цельсія

<?php //convet.php

//ініціалізуються змінні
  $f = $c = '';

//витягуються значення або з поля f, або з поля c
  if (isset($_POST['f']))
    $f = sanitizeString($_POST['f']);
  if (isset($_POST['c']))
    $c = sanitizeString($_POST['c']);

//PHP-функция intval - перевод в ціле число
  if ($f !='') {
    $c = intval((5 / 9) * ($f - 32));
    $out = "$f °f дорівнює $c °c";
  } elseif ($c != '') {
    // code...
    $f = intval((9 / 5) * $c + 32);
    $out = "$c °c дорівнює $f °f";
  }
  else $out = "";

  echo <<<_END
  <html>
    <head>
      <title>Програма перевода температури</title>
    </head>
    <body>
      <pre>
        Введіть температуру по Фаренгейту або по Цельсію
        і натисніть кнопку Перевести

        <b>$out</b>
        <form class="" action="$_SERVER[PHP_SELF]" method="post">
          По Фаренгейту <input type="text" name="f" size="7">
          По Цельсію <input type="text" name="c" size="7">
          <input type="submit" value="Перевести">
        </form>
      </pre>
    </body>
  </html>
_END;

function sanitizeString($var) {
  $var = stripslashes($var);
  $var = strip_tags($var);
  return $var;
}
echo "$_SERVER[PHP_SELF]";
?>
Програма перевода температури
        Введіть температуру по Фаренгейту або по Цельсію
        і натисніть кнопку Перевести

        
        
По Фаренгейту По Цельсію
/11_obrabotka_form_nixon.php