#php #mysql #arrays #search
#php #mysql #массивы #Поиск
Вопрос:
У меня есть два вопроса, касающиеся моего скрипта и поиска. У меня есть этот скрипт:
$searchTerms = explode(' ', $varSearch);
$searchTermBits = array();
foreach($searchTerms as $term){
$term = trim($term);
if(!empty($term)){
$searchTermBits[] = "column1 LIKE '%".$term."%'";
}
}
$sql = mysql_query("SELECT * FROM table WHERE ".implode(' OR ', $searchTermBits)."");
У меня есть столбец 1 с именем данных «скалолазание здесь»
Если я введу «скалолазание», эти данные отобразятся. Это идеально, но если я просто наберу «Rocks», это не отобразится. Почему это?
Кроме того, как бы мне добавить еще один «column2» для ключевого слова для поиска?
Спасибо!
Ответ №1:
Поиск в этой строке «rocks» не работает, потому что строка «rocks» не существует в данных. Глядя на это, это имеет смысл для вас, потому что вы знаете, что множественное число «rock» — это «rocks», но база данных этого не знает.
Один из вариантов, который вы могли бы попробовать, это удалить S из поисковых запросов, но при этом вы столкнетесь с другими проблемами — например, множественное число «berry» — это «ягоды», и если вы удалите S, вы будете искать «berrie», что не приведет вас дальше.
Вы можете добавить больше условий поиска, добавив больше строк, таких как
$searchTermBits[] = "column1 LIKE '%".$term."%'";
и замена ".$term."
на то, что вы хотите найти. Например,
$searchTermBits[] = "column1 LIKE '%climb%'";
Следует отметить еще одну вещь … как написано, ваш код подвержен SQL-инъекции. Возьмем это для примера… Что делать, если посетитель сайта вводит поисковый запрос '; DROP TABLE tablename;
У вас только что были удалены ваши данные.
Что вам следует сделать, так это изменить searchTermBits[]
строку, чтобы она выглядела как:
$searchTermBits[] = "column1 LIKE '%" . mysql_real_escape_string($term) . "%'";
Это предотвратит повреждение ваших данных любой гадостью.
Комментарии:
1.
'; drop table'
Бит не соответствует истине для mysql_query, потому что эта функция позволит выполнить 1 и только 1 запрос. Однако у вас могут возникнуть проблемы с' or (1=1) UNION select password, username, email from users --
запросами, в которых конфиденциальные данные передаются на экран.2. Я рассмотрел sql-инъекцию. Я не показываю это здесь из-за простоты. Но все равно спасибо, что упомянули об этом. Кроме того, мне не нравится просто использовать «climb», потому что это будет динамическая страница, на которой я буду использовать несколько слов и иметь несколько слов в моей базе данных. Но я пытаюсь получить его, чтобы он показывал rock при поиске rocks, как бы я мог создать такой скрипт?
3. Строка «climb» была предназначена в качестве примера. У вас может быть столько строк $searchTermBits[] = «…», сколько вам нравится — вы создаете массив условий. Таким образом, вы могли бы добавить $ term1, $ term2, $ term3 и т.д.
Ответ №2:
Предполагая, что предоставленные вами данные точны, они не должны совпадать, потому что вы используете «Rocks», а слово в строке — «rock». По умолчанию mysql не выполняет сопоставление с учетом регистра, так что, вероятно, это не так.
Кроме того, чтобы избежать внедрения SQL, вам обязательно следует использовать mysql_real_escape_string для экранирования вашего содержимого.
Добавление второго столбца также было бы довольно простым. Просто добавьте две записи в свой массив для каждого поискового запроса, одну для столбца 1 и одну для столбца 2.
Ответ №3:
-
Данные вашего столбца 1
rock cheer climbing here
вашим критериям поиска%Rocks%
совсем не соответствуют, так какrocks
их нет в ваших данных столбца 1 -
вы можете добавить столбец 2, как вы делаете для столбца 1, а затем объединить все это с помощью оператора AND
(column1 LIKE "%rock%" OR column1 LIKE "%climb%") AND (column2 LIKE "%rope%" OR column2 LIKE "%powder%")
СОВЕТЫ: Если ваша таблица / схема использует сопоставление xx_xx_ci (тогда это означает, что регистр не чувствителен, mysql не учитывает регистр), но если другое, то вам нужно убедиться, что поисковый запрос должен учитывать регистр (mysql учитывает регистр).