PHP та HTML

PHP та HTML глибоко взаємодіють: PHP може генерувати HTML, а HTML може передавати інформацію до 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();
}
?>

add a note

User Contributed Notes

There are no user contributed notes for this page.
To Top