1. Какое кодирование/декодирование я
должен выполнять при передаче значения в HTМL-форме? А через URL?
Есть несколько этапов, когда кодировка имеет важное значение. Предположим, у вас имеется переменная
string$data, содержащая строку,
которую вы хотите передать некодированным способом. Тогда необходимые шаги:
HTML-интерпретация. Чтобы специфицировать произвольную строку, вы
обязаны заключить её в двойные кавычки, а htmlspecialchars - всё значение.
URL: URL состоит из нескольких частей. Если вы хотите, чтобы ваши
данные интерпретировались как один элемент, вы обязаны кодировать их с помощью
urlencode().
Примечание:
неверным будет urlencode()$data, поскольку за urlencode() данных
отвечает браузер. Все популярные браузеры делают это корректно.
Заметьте, что это делается независимо от метода (GET или POST). Вы увидите это
только при методе GET, поскольку POST-запросы обычно скрыты/hidden.
Примечание:
эти данные будут выведены в браузере так, как задумано, поскольку
браузер будет интерпретировать заменённые (escaped) html-символы.
При отправке, через GET или POST, данные будут url-кодированы браузером
для передачи и непосредственно url-декодированы в PHP. Поэтому в результате
вам ничего не нужно urlencodе/urldecodе самостоятельно, всё необходимое выполняется автоматически.
Примечание:
фактически вы обходите HTML GET-запрос, поэтому нужно вручную urlencode() данные.
Примечание:
вы должны htmlspecialchars() весь URL, поскольку
URL появляется как значение HTML-атрибута. В этом случае браузер сначала де-htmlspecialchars() значение, а затем передаёт URL. PHP поймёт URL корректно, так как вы
urlencoded() данные.
Вы увидите, что символ & в URL будет заменён на
&. Хотя большинство браузеров исправят ситуацию, если вы забудете сделать это,
это не всегда возможно. Поэтому, даже если даже ваш URL не является динамическим, вы должныhtmlspecialchars() URL.
2.
Я пытаюсь использовать тэг <input type="image">, но переменные $foo.x и $foo.y недоступны. Где они?
При отправке формы можно использовать с тэгом изображение вместо стандартной кнопки submit, как здесь:
<input type="image" src="image.gif" name="foo">
Когда пользователь щёлкает по изображению, соответствующая форма будет
передана на сервер с двумя дополнительными переменными: foo.x и foo.y.
Поскольку $foo.x и $foo.y являются неверными именами переменных в PHP,
они автоматически конвертируются в $foo_x и $foo_y. То есть, точки заменяются на символы подчёркивания.
3. Как мне создать массивы в HTML-тэге <form>?
Чтобы получить результат вашей <form>, отправленный как
массив в ваш PHP-скрипт, вы
именуете элементы <input>, <select> или <textarea> таким образом:
Обратите внимание на квадратные скобки после имён переменных, это то,
что делает их массивом. Вы можете группировать элементы в разные массивы, присвоив одно имя разным элементам:
Массив AnotherArray теперь будет содержать ключи 0, 1, email и phone.
Примечание: специфицирование ключей массива делается в HTML по выбору. Если вы не
специфицируете ключи, массив заполняется элементами в порядке их появления на
форме. Массив нашего первого примера будет содержать ключи 0, 1, 2 3.
4.
Как мне получит все результаты из HTML-тэга множественного выбора select?
Тэг select multiple в HTML позволяет пользователю делать выбор нескольких
позиций в списке. Эти позиции передаются затем обработчику акции формы. Проблема
в том, что они все передаются с одним и тем же именем. Например:
<select name="var" multiple>
Каждая выбранная опция дойдёт до обработчика акции как:
var=option1
var=option2
var=option3
Каждая опция будет перезаписывать содержимое предыдущей переменной $var. Решением будет
использование "массива элемента form" РНР. Нужно использовать следующее:
<select name="var[]" multiple>
Это говорит PHP, что переменную $var нужно считать массивом, и
каждое присвоение значения var[] добавляет элемент в этот массив. Первый элемент будет $var[0],
следующий - $var[1] и т.д. Функция count()
может использоваться для определения количества выбранных опций, а функция sort() - для сортировки массива опций, если необходимо.
Обратите внимание, что, если вы используете JavaScript, наличие [] в имени
элемента может создать проблемы, если вы попытаетесь обратиться к
элементу по имени. Вместо имени используйте id элемента формы или заключите имя
переменной в одинарные кавычки и используйте его как индекс в массиве элементов, например: