(переименовал это из «Проверка непустого запроса в запросе GET?», Поскольку к тому времени, когда я закончил писать, это не стало важной частью моего вопроса.)
Я помогаю другу специалисту по генеалогии с простым скриптом поиска в БД. Ничего страшного, если пользователи оставят все поля ввода, кроме одного, пустыми. Я хотел бы различать 3 случая:
- someone browsing to the URL with no query parameters
- form submission with all fields empty
- form submission with at least one field non-empty
Я, вероятно, могу относиться к 1 и 2 одинаково; это не должно быть причудливым.
Код ранее имел if (isset($_POST['submit']))
и, по-видимому, работал. Я хочу использовать запрос GET
, чтобы люди могли добавлять результаты поиска в закладки. Сначала я предположил, что могу просто проверить $_GET['submit']
, но он никогда не устанавливается. Я предполагаю, что для запроса GET
мне понадобится скрытое текстовое поле с именем submit
в форме для создания ?submit=
в URL-адресе запроса? Дальнейшее загромождение URL-адреса - это не то, чего я хочу, поэтому, пожалуй, я откажусь от этой идеи.
Google нашел МНОГО совпадений для isset($_GET['submit'])
на форумах и так далее. Обычно другой плохой код в вопросе привлекал внимание людей, поэтому я никогда не встречал обсуждения фактического использования этой конструкции с GET
запросами. Итак, в качестве отступления от основного вопроса, мне любопытно, как isset($_GET['submit'])
стал полураспространенным. Это обычно просто из-за того, что наивные люди вроде меня меняют POST
на GET
?
Поскольку я новичок в PHP, я был бы очень признателен, если бы кто-нибудь мог указать на какие-либо другие проблемы в этом фрагменте скрипта поиска. Я почти уверен, что он широко открыт для SQL-инъекций, поэтому мне нужно использовать выходные данные escape-функции, чтобы их дезинфицировать. Обычно также проверяют длину входных строк? Форма, которая отправляет запросы к этому сценарию, имеет ограничения по длине.
(Я знаю, что SO не приветствует вопросы проверки кода, поэтому, я думаю, не стесняйтесь игнорировать эту часть моего вопроса.)
msearchresultlist.php:
получает запросы типа ...php/?Surname=Cordes&MaidenName=&GivenName=&Obit=
из формы (в конце этого блока кода). Он распечатывает таблицу совпадений.
Одна запись в каждой строке является гиперссылкой на страницу сведений об этом некрологе.
<?PHP
... check that user is logged in to members area ...
if (some_condition_discussed_above) {
... open the DB, with hard-coded username/password :( ...
$GivenName = $_GET['GivenName'];
if ($GivenName == "")
{$GivenName = '%';}
$Surname = $_GET['Surname'];
if ($Surname == "")
{$Surname = '%';}
$MaidenName = $_GET['MaidenName'];
if ($MaidenName == "")
{$MaidenName = '%';}
$Obit = $_GET['Obit'];
$result = mysql_query ("SELECT * FROM obits
WHERE GivenName LIKE '%$GivenName%'
AND MaidenName LIKE '$MaidenName%'
AND Surname LIKE '$Surname%'
AND Obit LIKE '%$Obit%'
ORDER BY Surname ASC, GivenName ASC");
} else {
$noquery = true;
}
?>
<!DOCTYPE html>
<html lang="en">
... some stuff on the page
<?php
if ($noquery) {
print "<p>No query found.</p>";
} else {
print "<table width='600' cellpadding='10px'>";
if($row = mysql_fetch_array($result)) {
do {
print "<tr>";
print "<td>".$row['Surname']."</td>";
print "<td>".$row['MaidenName']."</td>";
print "<td>" . '<a href="msearchresultform.php?ID='.$row['ID'].'">'.$row['GivenName'].'</a>'. "</td>";
print "<td>".$row['DOD']."</td>";
print"</tr>";
} while($row = mysql_fetch_array($result));
---- the form, on another page:
<form action=msearchresultlist.php method=GET>
When searching for a name with an apostrophe, such as O'Neil, use a double apostrophe, ie. O''Neil, not a quote but a double apostrophe. </br>
</br>
Search for:
<p>Last Name: <input type=text name=Surname size=15 maxlength=15>
<p>Maiden Name: <input type=text name=MaidenName size=15 maxlength=15>
<p>Given Name: <input type=text name=GivenName size=15 maxlength=15>
<p>Use % in front of each word in the Obit field, ie %Bridgewater% %Joudrey%
<p>Obit: <input type=text name=Obit size=50 maxlength=50>
<p>
<input type=submit>
Я знаю, что поиск может сбросить всю базу данных, выполнив поиск по одному подстановочному знаку или что-то в этом роде. Я думаю, что это желаемый результат моего друга, но я не хочу, чтобы это произошло случайно. то есть только в том случае, если пользователь явно ищет по подстановочному знаку, а не просто отправляет пустую форму. Этот сценарий расширенного поиска доступен только для аутентифицированных пользователей. Существует общедоступная версия только для фамилий (на nsobits.ca)
В любом случае, на случай, если неясно, о чем я спрашиваю: могу ли я сделать что-то умное, чтобы проверить, было ли что-то заполнено в форме? Как некоторый синтаксис, который проверяет, имеет ли $_GET
значение ненулевой длины по крайней мере для одного из своих ключей? Или мне просто сделать if ($GivenName || $Surname || ...)
?
$_GET['submit']
КОГДА-ЛИБО будет установлен. Он не устанавливается даже при отправке запроса. О, я забыл включить html для формы в свой вопрос. Но я предполагаю, что он будет установлен только в том случае, если вы сконструируете форму так, чтобы URL-адрес запроса был длиннее и включал?submit=Submit
или что-то в этом роде.fieldsEmpty()
это то, что я думал, что я мог бы в конечном итоге сделать, да. Спасибо. 07.07.2015$_GET['submit']
будет установлен только в том случае, если бы у вас было поле, и в этом нет смысла. Вы можете использовать!empty($_GET)
, чтобы проверить, были ли переданы какие-либо параметры запроса. 07.07.2015