- •Область применения
- •История php
- •2. Змінні. Константи. Вбудовані константи. Елементи структурного програмування (розгалуження, організація циклів, передача управління) Основы
- •Предопределенные переменные
- •Область видимости переменной
- •Ключевое слово global
- •Использование статических (static) переменных
- •Ссылки с глобальными (global) и статическими (static) переменными
- •Переменные переменных
- •Переменные извне php html-формы (get и post)
- •Имена переменных кнопки-изображения
- •Точки в именах приходящих переменных
- •Определение типов переменных
- •Константы Содержание
- •Синтаксис
- •"Волшебные" константы
- •Выражения
- •3. Використання масивів у php. Способи створення масиву. Індексні масиви.Асоціативні масиви Массивы
- •Синтаксис Определение при помощи array()
- •Создание/модификация с помощью синтаксиса квадратных скобок
- •Полезные функции
- •Что можно и нельзя делать с массивами
- •Так что же в этом плохого?
- •Преобразование в массив
- •Сравнение
- •Примеры
- •4. Функції в php. Синтаксис опису функцій. Порядок визначення і виклику. Способи
- •Функции, определяемые пользователем
- •Аргументы функции
- •Передача аргументов по ссылке
- •Значения аргументов по умолчанию
- •Списки аргументов переменной длины
- •Возврат значений
- •Обращение к функциям через переменные
- •Анонимные функции
- •5. Схема роботи Web-додатку, архітектура клієнт-сервер. Протокол http. Загальна структура http-повідомлень (запит, відповідь)
- •Технические особенности[править | править вики-текст]
- •Архитектура веб-приложений[править | править вики-текст]
- •Программное обеспечение[править | править вики-текст]
- •Клиенты[править | править вики-текст]
- •Исходные серверы[править | править вики-текст]
- •Прокси-серверы[править | править вики-текст]
- •История развития[править | править вики-текст]
- •Структура протокола[править | править вики-текст]
- •Стартовая строка[править | править вики-текст]
- •Методы[править | править вики-текст]
- •Options[править | править вики-текст]
- •Get[править | править вики-текст]
- •Head[править | править вики-текст]
- •Post[править | править вики-текст]
- •Put[править | править вики-текст]
- •1Xx Informational («Информационный»)
- •2Xx Success («Успех»)
- •3Xx Redirection («Перенаправление»)
- •4Xx Client Error («Ошибка клиента»)
- •5Xx Server Error («Ошибка сервера»)
- •Заголовки[править | править вики-текст]
- •Тело сообщения[править | править вики-текст]
- •Основные механизмы протокола[править | править вики-текст] Частичные get[править | править вики-текст]
- •Условные get[править | править вики-текст]
- •Согласование содержимого[править | править вики-текст]
- •Управляемое сервером[править | править вики-текст]
- •Управляемое клиентом[править | править вики-текст]
- •Прозрачное согласование[править | править вики-текст]
- •Множественное содержимое[править | править вики-текст]
- •Особенности протокола[править | править вики-текст]
- •6. Обробка даних html-форм. Способи передачі параметрів сценарію php. Звернення до параметру, переданому з форми Обработка данных из html-форм при помощи php
- •Способы передачи параметров сценарию
- •Передача параметров с помощью html-форм
- •Назначение[править | править вики-текст]
- •Понятие[править | править вики-текст]
- •История[править | править вики-текст]
- •Заблуждения[править | править вики-текст]
- •Работа куки[править | править вики-текст] Установка куки[править | править вики-текст]
- •Атрибуты куки[править | править вики-текст]
- •Условия истечения срока хранения[править | править вики-текст]
- •Аутентификация[править | править вики-текст]
- •Настройка браузера[править | править вики-текст]
- •Приватность и сторонние куки[править | править вики-текст]
- •Недостатки куки[править | править вики-текст]
- •Неточная идентификация[править | править вики-текст]
- •Кража куки[править | править вики-текст]
- •Подмена куки[править | править вики-текст]
- •Межсайтовые куки[править | править вики-текст]
- •Нестабильность между клиентом и сервером[править | править вики-текст]
- •Срок действия куки[править | править вики-текст]
- •Альтернативы куки[править | править вики-текст]
- •Url (строка запроса)[править | править вики-текст]
- •Скрытые поля формы[править | править вики-текст]
- •Http-аутентификация[править | править вики-текст]
- •Сохранение на клиентской стороне[править | править вики-текст]
- •Куки и сессии http
- •Обеспечение безопасности передачи данных http
- •Назначение[править | править вики-текст]
- •Понятие[править | править вики-текст]
- •История[править | править вики-текст]
- •Заблуждения[править | править вики-текст]
- •Работа куки[править | править вики-текст] Установка куки[править | править вики-текст]
- •Атрибуты куки[править | править вики-текст]
- •Условия истечения срока хранения[править | править вики-текст]
- •Аутентификация[править | править вики-текст]
- •Настройка браузера[править | править вики-текст]
- •Приватность и сторонние куки[править | править вики-текст]
- •Недостатки куки[править | править вики-текст]
- •Неточная идентификация[править | править вики-текст]
- •Кража куки[править | править вики-текст]
- •Подмена куки[править | править вики-текст]
- •Межсайтовые куки[править | править вики-текст]
- •Нестабильность между клиентом и сервером[править | править вики-текст]
- •Срок действия куки[править | править вики-текст]
- •Альтернативы куки[править | править вики-текст]
- •Url (строка запроса)[править | править вики-текст]
- •Скрытые поля формы[править | править вики-текст]
- •Http-аутентификация[править | править вики-текст]
- •Сохранение на клиентской стороне[править | править вики-текст]
- •8. Сесії (сеанси) php, основна ідея використання сесій, початок сеансу, завершення сеансу. Ідентифікатор сесії. Змінні сесії
- •Открытие сессии
- •Регистрация переменных сессии
- •Закрытие сессии
- •Пример простой сессии
- •Передача идентификатора сессии
- •9. Багатофайлові сценарії php. Включення файлів, принцип роботи include, include_once, require, require_once
- •10. Створення класу, синтаксис опису. Створення об'єкта Классы и объекты в php
- •11. Успадкування, модель одиночного наслідування. Синтаксис опису класу-нащадка Наследование (программирование)
- •Типы наследования[править | править вики-текст] Простое наследование[править | править вики-текст]
- •Множественное наследование[править | править вики-текст]
- •Единый базовый класс[править | править вики-текст]
- •Наследование в языках программирования[править | править вики-текст]
- •Delphi (Object Pascal)[править | править вики-текст]
- •Python[править | править вики-текст]
- •Php[править | править вики-текст]
- •Objective-c[править | править вики-текст]
- •Java[править | править вики-текст]
- •C#[править | править вики-текст]
- •Ruby[править | править вики-текст]
- •JavaScript[править | править вики-текст]
- •Конструкторы и деструкторы[править | править вики-текст]
- •12. Абстрактний метод, абстрактний клас. Інтерфейс и, призначення, синтаксис опису, реалізація.
- •Содержание
- •Примеры[править | править вики-текст]
- •C#[править | править вики-текст]
- •Описание и использование интерфейсов[править | править вики-текст]
- •Интерфейсы и абстрактные классы[править | править вики-текст]
- •История[править | править вики-текст]
- •Назначение[править | править вики-текст]
- •Концепция[править | править вики-текст]
- •Наиболее частые ошибки[править | править вики-текст]
- •Строковые типы
- •Бинарные данные
- •Целые числа
- •Дробные числа
- •Типы даты и времени
- •Команды sql
- •Типы полей базы данных
- •15. Функції php управління з'єднанням з MySql. Функції php побудови і виконання запитів на сервері MySql. Функції php обробки результату запиту Функции php для работы с MySql
- •16. Область використання .Htaccess ответ 1: Защита сайта с помощью .Htaccess и .Htpasswd
- •Ответ 2:Защита сайта с помощью .Htaccess и .Htpasswd
- •Базовая аутентификация
- •Замечание
- •Замечание
- •Замечание
- •Замечание
- •Создание файла с паролями .Htpasswd
- •Замечание
- •Замечание
- •Защита файлов .Htpasswd
- •Создание файла .Htaccess
- •Пример файла .Htaccess
- •Внимание!
- •Файлы групп
6. Обробка даних html-форм. Способи передачі параметрів сценарію php. Звернення до параметру, переданому з форми Обработка данных из html-форм при помощи php
Продолжаем знакомство с HTML-формами. В прошлой статье я уже немного затрагивал вопрос обработки данных из HTML-форм, здесь мы рассмотрим этот вопрос более подробно.
Итак, данные из HTML-форм отправляются при помощи GET или POST HTTP-запросов. В GET-запросе параметры находятся непосредственно в URL и видны в адресной строке браузера. В POST-запросе данные находятся в теле HTTP-пакета. Данные получает страница, указанная в атрибуте action тега HTML-формы form, например, PHP-скрипт.
Зачастую страница, генерирующая HTML-форму и страница, принимающая данные из нее физически представляет из себя один PHP-файл. Это удобно в том случае, когда, допустим, при некорректных введенных данных необходимо повторно показать форму пользователю и указать на его ошибки. Также это упрощает структуру движка сайта и его последующий анализ. Но все зависит от конкретных задач.
С точки зрения PHP принципиального отличия между GET и POST-параметрами нет. GET-параметры размещаются в глобальном массиве $_GET, POST — в $_POST.
Рассмотрим такой пример:
<form method="GET" action="<?php echo $_SERVER['PHP_SELF']; ?>">
<input type="text" name="name" /><br />
<input type="submit" value="Send" />
</form>
Сразу обратите внимание, что значение атрибута action представляет собой PHP-вставку. Переменная$_SERVER['PHP_SELF'] содержит имя и путь текущего выполняемого PHP-скрипта относительно корневого каталога веб-сервера. Таким образом, action всегда будет указывать на самого себя, в независимости от расположения и имени файла.
Определить, что данные были переданы можно несколькими способами. Например, можно проверять размер массива $_GET (или $_POST в случае с POST-запросом). Если размер ненулевой, то были переданы какие-то данные:
if ( count($_GET) > 0 )
{
echo 'GET-параметры были приняты!';
//--Здесь можно обрабатывать принятые данные
}
Давайте теперь добавим какое-то ограничение на вводимые данные. Например:
Введите ваше имя (минимум 3 символа): <input type="text" name="name" /><br />
В обработчике будем проверять длину имени, и, если она недопустимая, выводить предупреждение пользователю и возможность исправиться:
if ( count($_GET) > 0 ) //--Если были приняты данные из HTML-формы
{
$name = $_GET['name']; //--Получаем имя из GET-параметров
if ( strlen($name) >= 3 ) //--Проверяем, допустимая ли длина имени
{
//--Здесь обрабатываем полученное имя
echo 'Спасибо! Ваше имя успешно получено!';
exit; //--Завершаем работу PHP-скрипта. В этом случае HTML-форма выведена не будет
}
else //--Иначе предупреждаем пользователя
{
echo 'Вы ввели слишком короткое имя!';
}
}
Код предельно прост. Также логично при предупреждении пользователя не вынуждать его снова вводить данные, а давать возможность исправить возможные ошибки. Делается это просто: в атрибуты value полей формы подставляются ранее введенные данные:
Введите ваше имя (минимум 3 символа): <input type="text" name="name" value="<?php echo $name; ?>" /><br />
Тут есть два замечания. Во-первых, при отсутствии GET-данных переменная $name становится не определена. В этом случае ей лучше задать пустое значение:
$name = '';
Во-вторых, пользователь умышленно или неумышленно может ввести в поле ввода имени часть HTML-кода, например:
" />
и тогда при подставлении данных в value мы получим следующее:
<input type="text" name="name" value="" />" /><br />
то есть, преждевременное закрытие атрибута value и, как следствие, испорченный код страницы. Позже мы поговорим о возможных серьезных последствиях таких недочетов. Решается это просто: необходимо выполнять предобработку данных, пришедших в скрипт извне, прежде чем выводить их на странице. В нашем скрипте данные извне попадают в строке:
$name = $_GET['name'];
Обработаем параметр с помощью PHP-функции htmlspecialchars:
$name = htmlspecialchars($_GET['name']);
Данная функция заменяет в строке одинарные, двойные кавычки, треугольные скобки и амперсанд на соответствующие коды HTML-спецсимволов, что позволяет, допустим, выводить HTML-код в виде текста без обработки браузером. Таким образом текст гарантированно не попадет за пределы значения value.
И еще, условие проверки длины
if ( strlen($name) >= 3 )
лучше заменить на
if ( strlen($_GET['name']) >= 3 )
то есть, проверять длину нефильтрованного значения, так как в процессе фильтрации длина может измениться и проверка будет неточной. Конечный код будет таким:
<?php
$name = ''; //--Инициализируем переменную name
if ( count($_GET) > 0 ) //--Если были приняты данные из HTML-формы
{
$name = htmlspecialchars($_GET['name']); //--Получаем имя из GET-параметров
if ( strlen($_GET['name']) >= 3 ) //--Проверяем, допустимая ли длина имени
{
//--Здесь обрабатываем полученное имя
echo 'Спасибо! Ваше имя ' . $name . ' успешно получено!';
exit; //--Завершаем работу PHP-скрипта. В этом случае HTML-форма выведена не будет
}
else //--Иначе предупреждаем пользователя
{
echo 'Вы ввели слишком короткое имя!';
}
}
?>
<form method="GET" action="<?php echo $_SERVER['PHP_SELF']; ?>">
Введите ваше имя (минимум 3 символа): <input type="text" name="name" value="<?php echo $name; ?>" /><br />
<input type="submit" value="Send" />
</form>
В реальных условиях не забываем полностью оформлять код HTML-страницы (заголовки, body и т.п.).
Флажки на форме служат для ответа вида "да/нет". Как отмечалось в прошлой статье, если флажок не отмечен, в параметрах ничего не передается. Иначе большинством браузеров передается параметр со значением on (если не задано конкретное значение value). Для анализа, в принципе, не важно значение, важно определить наличие параметра. Допустим, на форме есть флажок "Запомнить меня на сайте" с именем remember. В PHP это может быть обработано следующим образом:
if ( isset($_POST['remember']) ) //--Проверяем наличие параметра remember
{
//--Флажок был установлен. Выполняем операции по запоминанию юзера на сайте
}
else
{
//--Флажок не был установлен
}
Флажки также часто используются для выбора определенных элементов из набора. Рассмотрим пример. Допустим, есть массив предметов:
$elements = array(
array('id' => 1, 'name' => 'яблоко'),
array('id' => 2, 'name' => 'пирожок'),
array('id' => 3, 'name' => 'камень'),
array('id' => 4, 'name' => 'морковка'),
array('id' => 5, 'name' => 'ножницы'),
array('id' => 6, 'name' => 'огурец')
);
Массив содержит числовые идентификаторы и названия предметов. Реализуем форму, в которой можно бы было выбрать, допустим, съедобные предметы при помощи флажков. Код формы генерируется с помощью PHP на основе данных из массива:
echo 'Выберите съедобные предметы:'. "\n";
//--Открывающий тег form с action на самого себя
echo '<form method="GET" action="' . $_SERVER['PHP_SELF'] . '">' . "\n";
foreach($elements as $element) //--Пробегаемся циклом по массиву предметов
{
//--Выводим флажок для каждого предмета. name будет содержать идентификаторы элементов
echo ' <input type="checkbox" name="element' . $element['id'] . '" id="element' . $element['id'] . '">';
//--Выводим надпись для каждого флажка (название предмета)
echo ' <label for="element' . $element['id'] . '">' . $element['name'] . '</label><br />'. "\n";
}
echo ' <input type="submit" value="Готово" />'. "\n";
echo '</form>'. "\n";
Результат работы этого PHP-кода следующий:
Выберите съедобные предметы:
<form method="GET" action="/form.php">
<input type="checkbox" name="element1" id="element1"> <label for="element1">яблоко</label><br />
<input type="checkbox" name="element2" id="element2"> <label for="element2">пирожок</label><br />
<input type="checkbox" name="element3" id="element3"> <label for="element3">камень</label><br />
<input type="checkbox" name="element4" id="element4"> <label for="element4">морковка</label><br />
<input type="checkbox" name="element5" id="element5"> <label for="element5">ножницы</label><br />
<input type="checkbox" name="element6" id="element6"> <label for="element6">огурец</label><br />
<input type="submit" value="Готово" />
</form>
В обработчике проверяем, какие элементы были выбраны пользователем:
if ( count($_GET) > 0 ) //--Если были приняты данные из HTML-формы
{
echo 'Ваш выбор:<br />';
foreach($elements as $element) //--Пробегаемся циклом по массиву предметов
{
//--Проверяем, был ли передан параметр element1, element2 и т.д.
if ( isset($_GET[ 'element' . $element['id'] ]) )
echo $element['name'] . '<br />';
}
exit;
}
Обработчик помещается сразу после объявления массива. Конечный код:
<?php
$elements = array(
array('id' => 1, 'name' => 'яблоко'),
array('id' => 2, 'name' => 'пирожок'),
array('id' => 3, 'name' => 'камень'),
array('id' => 4, 'name' => 'морковка'),
array('id' => 5, 'name' => 'ножницы'),
array('id' => 6, 'name' => 'огурец')
);
if ( count($_GET) > 0 ) //--Если были приняты данные из HTML-формы
{
echo 'Ваш выбор:<br />';
foreach($elements as $element) //--Пробегаемся циклом по массиву предметов
{
//--Проверяем, был ли передан параметр element1, element2 и т.д.
if ( isset($_GET[ 'element' . $element['id'] ]) )
echo $element['name'] . '<br />';
}
exit;
}
echo 'Выберите съедобные предметы:'. "\n";
//--Открывающий тег form с action на самого себя
echo '<form method="GET" action="' . $_SERVER['PHP_SELF'] . '">' . "\n";
foreach($elements as $element) //--Пробегаемся циклом по массиву предметов
{
//--Выводим флажок для каждого предмета. name будет содержать идентификаторы элементов
echo ' <input type="checkbox" name="element' . $element['id'] . '" id="element' . $element['id'] . '">';
//--Выводим надпись для каждого флажка (название предмета)
echo ' <label for="element' . $element['id'] . '">' . $element['name'] . '</label><br />'. "\n";
}
echo ' <input type="submit" value="Готово" />'. "\n";
echo '</form>'. "\n";
?>
Хочу показать еще один способ обработки информации из таких форм. Значение атрибута name у всех флажков генерируется одинаковое, но с символами "[]" на конце. В этом случае PHP формирует переменную в виде массива, в котором будут содержаться значения атрибутов value отмеченных флажков. Соответственно, необходимо задать атрибуты value для флажков. Строку кода вывода флажков приводим к следующему виду:
echo ' <input type="checkbox" name="element[]" id="element' . $element['id'] . '" value="' . $element['id'] . '">';
В результате HTML-код флажков будет таким:
<input type="checkbox" name="element[]" id="element1" value="1"> <label for="element1">яблоко</label><br />
<input type="checkbox" name="element[]" id="element2" value="2"> <label for="element2">пирожок</label><br />
<input type="checkbox" name="element[]" id="element3" value="3"> <label for="element3">камень</label><br />
<input type="checkbox" name="element[]" id="element4" value="4"> <label for="element4">морковка</label><br />
<input type="checkbox" name="element[]" id="element5" value="5"> <label for="element5">ножницы</label><br />
<input type="checkbox" name="element[]" id="element6" value="6"> <label for="element6">огурец</label><br />
При такой реализации, при отметке флажков "яблоко", "пирожок", "морковка", "огурец" массив $_GET будет иметь следующие значения:
[element] => Array
(
[0] => 1
[1] => 2
[2] => 4
[3] => 6
)
Элемент element представляет из себя массив, в котором содержатся идентификаторы выбранных предметов. В обработчике остается лишь сопоставить им названия. В данном случае массив $elements оформлен не совсем удачно, подобная реализация формы была бы эффективной в случае, когда элементы переданного массива параметров были бы индексами массива данных.
Статья получается слишком объемной, пожалуй, продолжение в следующей части. Если есть вопросы, welcome в комментарии ;)
