array ( 0 => 'index.php', 1 => 'PHP Manual', ), 'head' => array ( 0 => 'UTF-8', 1 => 'uk', ), 'this' => array ( 0 => 'faq.html.php', 1 => 'PHP та HTML', ), 'up' => array ( 0 => 'faq.php', 1 => 'ЧаПи', ), 'prev' => array ( 0 => 'faq.passwords.php', 1 => 'Гешування паролів', ), 'next' => array ( 0 => 'faq.com.php', 1 => 'PHP і COM', ), 'alternatives' => array ( ), 'source' => array ( 'lang' => 'uk', 'path' => 'faq/html.xml', ), 'history' => array ( ), ); $setup["toc"] = $TOC; $setup["toc_deprecated"] = $TOC_DEPRECATED; $setup["parents"] = $PARENTS; manual_setup($setup); contributors($setup); ?>
PHP та HTML глибоко взаємодіють: PHP може генерувати HTML, а HTML може передавати інформацію до PHP. Перед читанням цих ЧаПів важливо, щоб ви навчилися отримувати змінні зі зовнішніх джерел. Сторінка посібника на цю тему також містить багато прикладів.
Є кілька етапів, для яких кодування є важливим. Припустимо, що ви маєте string $data, яка містить рядок, який ви хочете передати незакодованим. Це виглядатиме таким чином:
HTML-інтерпретація. Задаючи випадковий рядок, ви мусите помістити його у подвійні лапки та обробити таке значення функцією htmlspecialchars().
URL: URL складається з частин. Аби певні дані сприймалися, як частина URL, ви мусите закодувати їх за допомогою urlencode().
Приклад #1 Прихований елемент HTML-форми
<?php
echo '<input type="hidden" value="' . htmlspecialchars($data) . '" />'."\n";
?>
Зауваження: Не можна $data обробляти функцією urlencode() тому, що за це відповідає браузер. Усі популярні браузери роблять це правильно, незалежно від методу (себто GET або POST). Це помітно у випадку GET-запиту, бо POST-запити зазвичай приховані.
Приклад #2 Дані, що редагуються користувачем
<?php
echo "<textarea name='mydata'>\n";
echo htmlspecialchars($data)."\n";
echo "</textarea>";
?>
Зауваження: Ці дані браузер зображує належним чином тому, що інтерпретує екрановані HTML-символи. Після підтвердження форми через GET або POST, браузер закодує дані в URL для передавання до PHP, який їх розкодує. Тож вам не треба самостійно щось кодувати, все обробиться автоматично.
Приклад #3 В URL
<?php
echo '<a href="' . htmlspecialchars("/nextpage.php?stage=23&data=" .
urlencode($data)) . '">'."\n";
?>
Зауваження: Якщо ви модулюєте GET-запит, необхідно власноруч застосувати urlencode() до даних.
Зауваження: Вам потрібно обробити всю URL функцією htmlspecialchars(), щоб URL не сприйнялася, як код HTML. В такому разі браузер виконає зворотню до htmlspecialchars() дію стосовно значення та сприйме його, як URL. PHP зрозуміє URL коректно, бо ви обробили дані функцією urlencode(). Зауважте, що символ
&
в URL замінено на&
. Здебільшого браузери відновлять його, якщо ви забудете, але не завжди. Тож навіть якщо ваша URL не динамічна, вам потрібно застосувати htmlspecialchars() до URL.
Замість звичної кнопки для надсилання форми можна використовувати зображення за допомогою тегу:
<input type="image" src="image.gif" name="foo" />
Оскільки foo.x і foo.y містять в назвах недозволені символи, вони автоматично перейменуються на foo_x і foo_y. Тобто крапки заміняться на підкреслення. Таким чином, ви матимете доступ до цих змінних, як і до будь-яких інших, описаних в розділі про отримання змінних з зовнішніх джерел. До прикладу, $_GET['foo_x'].
Зауваження:
Пробіли в назвах змінних запиту перетворюються на підтвердження.
Для отримання в скрипті PHP надісланого результату як array, треба називати атрибути тегів <input>, <select> і <textarea> за зразком:
<input name="MyArray[]" /> <input name="MyArray[]" /> <input name="MyArray[]" /> <input name="MyArray[]" />
<input name="MyArray[]" /> <input name="MyArray[]" /> <input name="MyOtherArray[]" /> <input name="MyOtherArray[]" />
<input name="AnotherArray[]" /> <input name="AnotherArray[]" /> <input name="AnotherArray[email]" /> <input name="AnotherArray[phone]" />
Зауваження:
Визначення ключів масиву необов'язкове у HTML. Якщо ви не визначите їх, масив заповниться в тому порядку, в якому елементи розташовані у формі. Перший приклад міститиме ключі 0, 1, 2 та 3.
Докладніше: Функції для масивів, Змінні з зовнішніх джерел.
Множинний вид тегу <select> в HTML дозволяє користувачам обрати кілька елементів з списку. Далі ці елементи передаються до обробника дій форми. Проблема в тому, що вони всі передаються з однаковою назвою. Тобто:
<select name="var" multiple="yes">
var=option1 var=option2 var=option3
<select name="var[]" multiple="yes">
Майте, на увазі, якщо використовуєте JavaScript, []
в
назві елемента може спровокувати проблеми при намаганні звернутися до
елемента за атрибутом "name". Краще використати атрибут "id" або вкласти
назву змінної в одинарні лапки та використовувати її як індекс масиву
елементів. Наприклад:
variable = document.forms[0].elements['var[]'];
Оскільки код Javascript (зазвичай) виконує клієнт, а код PHP (зазвичай) — сервер, а HTTP — це протокол "без стану", дві мови не мають функціоналу прямого обміну змінними.
Проте є спосіб передавати змінні між ними двома. Перший шлях — згенерувати код Javascript в PHP, оновити браузер, передати потрібні змінні назад до скрипта PHP. Приклад нижче показує, як достеменно це зробити — він дозволяє коду PHP отримати висоту і ширину екрану, що за нормальних умов можливо тільки на стороні клієнта.
Приклад #4 Генерування Javascript в PHP
<?php
if (isset($_GET['width']) AND isset($_GET['height'])) {
// Вивести геометричні змінні
echo "Ширина екрана: ". $_GET['width'] ."<br />\n";
echo "Висота екрана: ". $_GET['height'] ."<br />\n";
} else {
// Передати геометричні змінні
// (підготувати рядок запиту
// — з методом POST змінні треба обробляти інакше)
echo "<script language='javascript'>\n";
echo " location.href=\"{$_SERVER['SCRIPT_NAME']}?{$_SERVER['QUERY_STRING']}"
. "&width=\" + screen.width + \"&height=\" + screen.height;\n";
echo "</script>\n";
exit();
}
?>