У меня есть структура URL со строкой запроса и параметром под названием position
,
пример:
http://computerhelpwanted.com/jobs/?occupation=administrator&position=network+administrator
У меня также есть выпадающий список выбора формы с именем выбора формы position
,
пример:
<form action="/jobs/" method="GET" id="menuform">
<select name="occupation" onChange="populate(this.id,\'position\')">
<option selected="" disabled="">Select Occupation</option>
<option value="administrator">Administrator</option>
</select>
<select name="position" onChange="this.form.submit()">
<option selected="" disabled="">Select Position</option>
<option value="network administrator">Network Administrator</option>
</select>
</form>
Когда пользователь делает выбор, он отправляет значения параметра в атрибут действия с параметром select name = «position» в качестве параметра для использования в строке запроса.
У меня вопрос, как мне получить доступ к значениям выбора формы отдельно от значений строки запроса?
Я использую метод _GET для вызова значения из параметра строки запроса.
пример:
$position = isset($_GET['position']) ? ($_GET['position']) : '';
Очевидно, это получает значение из структуры URL, а не элемента формы. Или, может быть, это так, не уверен. Но, проверяя его, я, кажется, пришел к выводу, что он получает его по URL, а не по форме.
Как я могу получить доступ к значению выбора формы при сравнении в моем PHP?
Обновить
У меня проблема с каноническим URL-адресом, указанным в заголовке.
<link rel="canonical" href="http://computerhelpwanted.com/jobs/?occupation=administrator&position=network-administrator" />
эта ссылка является индексированной ссылкой в Google. Я знаю, что могу просто перенаправить htaccess на новую ссылку, но я просто пытаюсь выяснить, как отобразить канонический URL для этой страницы.
так должно быть
<link rel="canonical" href="http://computerhelpwanted.com/jobs/?occupation=administrator&position=network+administrator" />
единственная разница заключается в -
и +
в строке запроса.
Не все строки моего запроса имеют +. У некоторых есть -. Но я показываю контент по обоим URL, независимо от того, есть ли у него — или +. В любом случае, оба URL получают одинаковое содержимое страницы.
Но поскольку каноническое создается динамически из URI, а не из значения элемента формы, на обеих страницах контента есть 2 разных канонических символа.
Использование _Get (‘value’) извлекает значение из строки запроса вместо элемента формы. Я знаю это, потому что значение элемента формы имеет пробел между network administrator
который получает urlencoded, когда форма представляет как network+administrator
, Так что, если я могу сравнить со значением элемента формы, я могу установить правильный канонический.
HTTP — это протокол без сохранения состояния, вы генерируете HTML-контент после вызова требуемой страницы, и затем он там. При взаимодействии с form
элемент, вы можете поместить значения выбора из предопределенных (построенных с DOM) опций, и вы можете передать это в другой файл для обработки. Когда вы передаете значения в этот файл процессора, вы можете сделать это с помощью различных методологий (для простоты давайте просто взглянем на GET и POST).
GET: преобразует параметры формы в URL-запрос, который вы также разместили в своем вопросе. Когда ваши данные поступают в виде массива GET в файл вашего процессора, сам файл не знает, из какой формы он их получил, он видит только запрос.
POST: закодирует ваши параметры в транспортный уровень, если он явно не виден, однако он все еще там.
Используя GET, вы можете вручную сформировать запрос с намеренно неверными или вредоносными параметрами и вызвать файл вашего процессора с ними. POST также может быть программно настроен как вредоносный, но обеспечивает удобный уровень запутывания как таковой, и, учитывая ваш вопрос, может обеспечить искомый эффект («не принимая его непосредственно из URL»).
редактировать:
Код для упрощения обработки параметров формы в соответствии с видимым шаблоном, видимым в вопросе и комментарии OP:
$validKeys = array(
'position',
'occupation'
);
foreach ($validKeys AS $key){
${$key} = isset($_GET[$key]) ? $_GET[$key] : '';
}
/* other processing code */
С учетом вышесказанного, если бы у вас было, скажем, 15 входных параметров, вам не пришлось бы проходить их все по одному, так как ${$key}
позволяет создавать переменные с динамическим именем, и вы просто обновляете $validKeys
контейнер (который также может быть заполнен значениями, хранящимися в базе данных и не контролируемыми вручную). Из вашего обновленного комментария я придумал, что вы можете искать что-то подобное.
Это потому, что вы используете GET, которым можно легко управлять через URL.
Я предлагаю изменить метод на POST. Его можно редактировать, используя отладчики.