Формы, массивы и передача данных в php

В учебнике "Изучаем PHP: Часть 1. Страница регистрации, формы и взаимодействие с базой данных" с сайта IBM все рассматривается на примере создания реального приложения.
В этом конспекте: базовый синтаксис PHP, формы в HTML, массивы, ассоциативный массив $_GET (или $_POST) и циклы.

Базовый синтаксис

Признак переменной - знак доллара $

<html>
  <title>Workflow Registration</title>
  <body>
  <p>You entered:</p>
  <?php
  $password = "mypassword";
  echo "<p>Password = " . $password . "</p>";
  ?>
</body>
</html>

Определение и использование константы:

<?php
define("PAGE_TITLE", "Workflow Registration");
?>
<html>
<title><?php echo PAGE_TITLE ?></title>
<body> ...

В отличие от переменных константы записываются без знака доллара. Имя константы может быть любым, но, согласно принятым правилам, имена констант состоят из прописных букв.

Упрощенный вывод: когда вывести нужно один элемент, есть более постой способ - оператор вывода <?= ?>:

<title><?= PAGE_TITLE ?></title>

Создание формы в HTML

Начнем с создания страницы регистрации для приложения. Для начала просто создадим форму для ввода в файле registration.php:

<html>
  <head><title>Workflow System</title></head>
  <body>
   <h1>Register for an Account:</h1>
    <form action="registration_action.php" method="GET">
     Username: <input type="text" name="name" /><br />
     Email: <input type="text" name="email" /><br />
     Password: <input type="password" name="pword" /><br />
     <input type="submit" value="GO" />
    </form>
  </body>
</html>

Поместите этот файл в корневую папку и откройте браузер с адресом http://localhost/registration.php.

Обратите внимание на URL в поле адреса браузера.

http://localhost/registration_action.php?name=roadnick&email=
ibmquestions%40nicholaschase.com&pword=supersecretpassword

Поскольку в качестве метода используется GET, данные из формы передаются в строке URL. Каждому элементу формы в URL соответствует пара имя-значение, и эти пары разделены амперсандами.

Получение данных из формы на PHP-странице

<?php
 $username = $_GET['name']; $password = $_GET['pword'];
?>

Массивы

$formnames = array("name", "email", "pword");
echo "0=".$formnames[0]."<br />";
...

Функция array() возвращает переменную, которая является массивом. Первое значение в массиве имеет индекс 0.

Переменная $_GET является именем ассоциативного массива, к элементам которого обращаются не по индексам, а по ключам. Когда вы отсылаете форму, вы создаете ассоциативный массив (имена переменных играют роль ключей - $_GET["name"]):

$_GET = array("name" => "roadnick",
  "email" => "ibmquestions@nicholaschase.com",
  "pword" => "supersecretpassword");

Структура ассоциативного массива не всегда известна, например, если ассоциативный массив был получен в результате выполнения запроса к базе данных.

Функции array_keys() и array_values() возвращают простые массивы, к элементам которых можно обращаться при помощи числовых индексов:

$form_names = array_keys($_GET);
$form_values = array_values($_GET);

Цикл for

Здесь используется функция sizeof() , которая возвращает число элементов массива:

for ($i = 0; $i < sizeof($_GET); $i++) {
  echo "<p>".$form_names[$i]." = " . $form_values[$i] . "</p>";
}

Цикл foreach

Значения из массива $_GET в цикле приписываются переменной $value. Цикл работает до тех пор, пока в массиве $_GET еще остаются необработанные элементы.
Доступ к данным массива напрямую без ключей:

foreach ($_GET as $value) {
 echo "<p>" . $value . "</p>";
}

Извлечение значений и ключей:

foreach ($_GET as $key=>$value) {
 echo "<p>".$key." = " . $value . "</p>";
}

Повторяющиеся значения в формах

Иногда в форме должно быть введено несколько значений для переменной с одним и тем же именем. Например, поле пароля и поле повтора пароля.

Username: <input type="text" name="name" /><br />
Email: <input type="text" name="email" /><br />
Password: <input type="password" name="pword[]" /><br />
Password (again): <input type="password" name="pword[]" /><br />
<input type="submit" value="GO" />

Поскольку поле pword должно содержать несколько значений, оно стало массивом. Таким образом, массив передаваемых данных для этой формы будет содержать в качестве одного из своих элементов другой массив. Когда вы нажмете кнопку отправки формы, в поле адреса вы увидите примерно следующее:

http://localhost/registration_action.php?
name=roadnick&email=ibmquestions%40nicholaschase.com&
pword[]=supersecretpassword&pword[]=supersecretpassword

Это значит, что были созданы массивы

$passwords = array("supersecretpassword", "supersecretpassword");
$_GET = array("name"=>"roadnick",
              "email"=>"ibmquestions@nicholaschase.com",
              "pword"=>$passwords);

И получать их значения нужно так:

foreach ($_GET as $key=>$value) {
  echo "<p>".$key." = " . $value . "</p>";
}
$passwords = $_GET["pword"];
echo "First password = ".$passwords[0];
echo "<br />";
echo "Second password = ".$passwords[1];

Там, где раньше отображался пароль, появится слово Array, а элементы самого массива нужно извлекать отдельно.

Методы GET и POST

При использовании метода GET данные передаются открыто в URL-адресе, т.е. данные доступны для просмотра. Это небезопасно, т.к. эти данные могут быть перехвачены. Кроме того, в URL-адресе можно передавать ограниченное по объему количество данных.

Поэтому в большинстве случаев имеет смысл использовать метод POST, который передает данные в теле запроса, а не в заголовке, как метод GET. Для этого в HTML-форме вместо $_GET нужно писать $_POST.

Проверка ошибки при повторном вводе пароля

Используем условный оператор if-then ( проверка равенства - это двойной знак равенства, т.е. ==):

$passwords = $_POST["pword"];
echo "First password = ".$passwords[0];
echo "<br />";
echo "Second password = ".$passwords[1];
if ($passwords[0] == $passwords[1]) {
 echo "<p>Пароли совпали.</p>";
} else {
 echo "<p>Пароли не совпали. Введите пароль еще раз. </p>";
}

Для формирования более сложных логических выражений можно применять логические операторы, например, оператор И (&&) и оператор ИЛИ (||). Например:

if (($today == "Monday") && ($status == "Not a holiday")) {
  echo "GO TO WORK!!!";
}

Продолжение - Функции

Опубликовано в рубрике Конспекты: Изучаем PHP 1 |

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *