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 глибоко взаємодіють: PHP може генерувати HTML, а HTML може передавати інформацію до PHP. Перед читанням цих ЧаПів важливо, щоб ви навчилися отримувати змінні зі зовнішніх джерел. Сторінка посібника на цю тему також містить багато прикладів.

  1. Яке кодування/декодування мені потрібно робити, коли я передаю значення через форму або URL?
  2. Я намагаюся використати тег <input type="image">, але змінні $foo.x і $foo.y недоступні. $_GET['foo.x'] не існує теж. Де вони?
  3. Як я можу створити масиви в HTML-тегові <form>?
  4. Як мені отримати всі вибрані варіанти з множинного виду HTML-тегу <select>?
  5. Як мені передати змінну з Javascript до PHP?
Яке кодування/декодування мені потрібно робити, коли я передаю значення через форму або URL?

Є кілька етапів, для яких кодування є важливим. Припустимо, що ви маєте 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 замінено на &amp;. Здебільшого браузери відновлять його, якщо ви забудете, але не завжди. Тож навіть якщо ваша URL не динамічна, вам потрібно застосувати htmlspecialchars() до URL.

Я намагаюся використати тег <input type="image">, але змінні $foo.x і $foo.y недоступні. $_GET['foo.x'] не існує теж. Де вони?

Замість звичної кнопки для надсилання форми можна використовувати зображення за допомогою тегу:

<input type="image" src="image.gif" name="foo" />
Коли користувач клацне десь на зображення, така форма буде передана серверу з двома додатковими змінними: foo.x and foo.y.

Оскільки foo.x і foo.y містять в назвах недозволені символи, вони автоматично перейменуються на foo_x і foo_y. Тобто крапки заміняться на підкреслення. Таким чином, ви матимете доступ до цих змінних, як і до будь-яких інших, описаних в розділі про отримання змінних з зовнішніх джерел. До прикладу, $_GET['foo_x'].

Зауваження:

Пробіли в назвах змінних запиту перетворюються на підтвердження.

Як я можу створити масиви в HTML-тегові <form>?

Для отримання в скрипті 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[]" />
Такий код створює два масиви "MyArray" та "MyOtherArray", які надсилаються до скрипта PHP. Також можливо називати ключі масивів:
<input name="AnotherArray[]" />
<input name="AnotherArray[]" />
<input name="AnotherArray[email]" />
<input name="AnotherArray[phone]" />
Масив "AnotherArray" міститиме ключі 0, 1, "email" і "phone".

Зауваження:

Визначення ключів масиву необов'язкове у HTML. Якщо ви не визначите їх, масив заповниться в тому порядку, в якому елементи розташовані у формі. Перший приклад міститиме ключі 0, 1, 2 та 3.

Докладніше: Функції для масивів, Змінні з зовнішніх джерел.

Як мені отримати всі вибрані варіанти з множинного виду HTML-тегу <select>?

Множинний вид тегу <select> в HTML дозволяє користувачам обрати кілька елементів з списку. Далі ці елементи передаються до обробника дій форми. Проблема в тому, що вони всі передаються з однаковою назвою. Тобто:

<select name="var" multiple="yes">
Обрані варіанти надійдуть до обробника дій таким чином:
var=option1
var=option2
var=option3
      
Кожен наступний обраний варіант буде переписувати попередній вміст змінної $var. Рішенням є використати можливість PHP робити "масив з елемента форми". Слід писати наступне:
<select name="var[]" multiple="yes">
Тоді PHP розглядатиме $var як масив, і кожне задавання значення var[] додаватиме елемент до масиву. Перший елемент стане $var[0], наступний — $var[1], і так далі. Функція count() може бути використана, щоб визначити кількість обраних варіантів, а функція sort() — для впорядкування масиву варіантів, якщо необхідно.

Майте, на увазі, якщо використовуєте JavaScript, [] в назві елемента може спровокувати проблеми при намаганні звернутися до елемента за атрибутом "name". Краще використати атрибут "id" або вкласти назву змінної в одинарні лапки та використовувати її як індекс масиву елементів. Наприклад:

variable = document.forms[0].elements['var[]'];
      

Як мені передати змінну з Javascript до PHP?

Оскільки код 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();
}
?>