Искать всю таблицу? PHP MySQL - PullRequest
4 голосов
/ 14 декабря 2009

Я создал следующий скрипт поиска, но при поиске в базе данных могу искать только один столбец таблицы:

$query = "select * from explore where site_name like '%".$searchterm."%'";

Я хотел бы знать, как я могу искать всю таблицу (исследовать). Кроме того, мне нужно исправить эту строку кода:

echo "$num_found. ".($row['site_name'])." <br />";

Последнее, что меня беспокоит, это то, что когда я нажимаю кнопку отправки на другой странице, я всегда отображаю сообщение «Пожалуйста, введите условие поиска» даже когда я вхожу во что-то?

Спасибо за любую помощь, вот весь сценарий, если это необходимо:

<?php
// Set variables from form.
$searchterm  = $_POST['searchterm'];
trim ($searchterm);

// Check if search term was entered.
if (!$serachterm)
{
    echo "Please enter a search term.";
}
// Add slashes to search term.
if (!get_magic_quotes_gpc())
{
    $searchterm = addcslashes($searchterm);
}

// Connects to database.
@ $dbconn = new mysqli('localhost', 'root', 'root', 'ajax_demo');
if (mysqli_connect_errno())
{
    echo "Could not connect to database. Please try again later.";
    exit;
}
// Query the database.
$query = "select * from explore where site_name like '%".$searchterm."%'";
$result = $dbconn->query($query);

// Number of rows found.
$num_results = $result->num_rows;
echo "Found: ".$num_results."</p>";

// Loops through results.
for ($i=0; $i <$num_results; $i++)
{
    $num_found = $i + 1;
    $row = $result->fetch_assoc();
    echo "$num_found. ".($row['site_name'])." <br />";
}

// Escape database.
$result->free();
$dbconn->close();
?>

Ответы [ 7 ]

7 голосов
/ 15 декабря 2009

В отличие от других ответов, я думаю, что вы хотите использовать «ИЛИ» в своем запросе, а не «И»:

$query = "select * from explore where site_name like '%".$searchterm."%' or other_column like '%".$searchterm."%'";

Заменить other_column именем второго столбца. Вы можете продолжать повторять часть, которую я добавил для каждого из ваших столбцов.

Примечание: это при условии, что ваша переменная $searchterm уже экранирована для базы данных, например, с $mysqli->real_escape_string($searchterm);. Всегда проверяйте, так ли это, или лучше используйте параметризованные запросы.

Аналогично, при выводе ваших переменных, таких как $row['site_name'] , всегда проверяйте, что вы экранировали их для HTML, например, используя htmlspecialchars($row['site_name']).

Последнее, что меня беспокоит, это то, что когда я нажимаю кнопку отправки на другой странице, я всегда отображаю сообщение «Пожалуйста, введите поисковый запрос». даже когда я вхожу во что-то?

Убедитесь, что в обеих формах используется один и тот же метод (пост в вашем примере). Тег <form> должен иметь атрибут method="post".

Кроме того, что не так с упомянутой вами строкой кода? Есть ли ошибка? Это должно работать, насколько я могу судить.

4 голосов
/ 15 декабря 2009
Запрос

A UNION даст результаты более оптимизированным способом, чем простое использование ИЛИ . Обратите внимание, что использование LIKE таким образом не позволит вам использовать любые индексы, которые вы можете иметь на своей таблице. Вы можете использовать следующее для обеспечения более оптимизированного запроса за счет потери нескольких возможных результатов:

$query = "SELECT * FROM explore WHERE site_name LIKE '".$searchterm."%'
          UNION
          SELECT * FROM explore WHERE other_field LIKE '".$searchterm."%'
          UNION
          SELECT * FROM explore WHERE third_field LIKE '".$searchterm."%'";

Этот запрос, вероятно, выполняется так же быстро, как и без поиска по FULLTEXT. Недостатком, однако, является , что вы можете сопоставлять только строки, начинающиеся с searchterm .

1 голос
/ 14 декабря 2009

Для поиска в других столбцах таблицы необходимо добавить условия к вашему sql

$query = "select * from explore where site_name like '%".$searchterm."%' or other_column like '%".$searchterm."%'";

Но если вы не знаете, я бы настоятельно рекомендовал пройтись по некоторому учебнику по sql ...

Также я не увидел ничего плохого в этой строке

echo "$num_found. ".($row['site_name'])." <br />";

Какое сообщение об ошибке вы получаете?

0 голосов
/ 15 декабря 2009

Что касается отображения сообщения, в вашем коде есть опечатка:

// Check if search term was entered.
if (!$serachterm)

должно быть:

// Check if search term was entered.
if (!$searchterm)

В написанном вами коде !$serachterm всегда оценивается как true, потому что вы никогда не объявляли переменную $seracherm (обратите внимание на опечатку).

0 голосов
/ 14 декабря 2009

ваш код очень глючит для SQL инъекций, сначала сделайте сделай это

$searchterm = htmlspecialchars($searchterm);
trim($searchterm);

следующий

$query = mysql_real_escape_string($query);

наконец, ваш поиск выглядит следующим образом

$query = "select * from explore where site_name like '%$searchterm%';
0 голосов
/ 14 декабря 2009

Вы просматриваете всю таблицу, ограничивая результаты только теми, где site_name like '%".$searchterm."%'. Если вы хотите найти все из этой таблицы, вам нужно удалить предложение WHERE

Вот исправленная строка. В тебе было слишком много цитат.

echo $num_found.".".($row['site_name'])." <br />";
0 голосов
/ 14 декабря 2009

Просто добавьте 'AND column = "condition"' к предложению WHERE вашего запроса.

Будьте осторожны с добавлением множества условий типа LIKE%, поскольку они могут быть очень медленными, особенно если вы используете передний подстановочный знак. Это заставляет СУБД искать каждую строку. Вы можете оптимизировать, если используете индекс для столбца и только конечный подстановочный знак.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...