вопрос поиска в базе данных PHP

0

мой код это,

$query = "SELECT * FROM  `cars` WHERE  (color LIKE '%". $key ."%' OR name LIKE '%". $key ."%') AND enabled = 'yes'  ORDER BY  `ID`";
База данных

выглядит следующим образом

ID     color       name        enabled
----  ------     --------     ---------
1       red        red car       yes
2      blue        blue car      yes
3       brown      brown car     yes

т

когда я просматриваю ключ "красный", он возвращает первое поле (ID 1), но если я ищу "красный автомобиль", он ничего не возвращает.

как я могу искать оба поля?

спасибо

EDIT: я фиксированные скобки, но все же я не могу получить результаты с более чем одним словом.

Пробовал это без везения

  $query = "SELECT * FROM  `cars` WHERE  (MATCH (color,name) AGAINST ('$key' IN BOOLEAN MODE)) AND enabled = 'yes'  ORDER BY  `ID`";

ИЗМЕНИТЬ 2: Питер прав. В запросе нет проблем. странно       Я использую это

$key = $_GET['key'];

если $_GET ['key'] больше, чем 1 слово, ключ $возвращает пустую причину.

  • 0
    Само собой разумеется, что вы должны быть осторожны с инъекцией SQL.
  • 1
    Я не думаю, что это является причиной, но вы действительно должны поставить круглые скобки вокруг ваших критериев WHERE. Порядок, в котором решаются ваши AND и OR, может не соответствовать ожидаемому.
Теги:

4 ответа

2
Лучший ответ

Я не могу дублировать вашу ошибку. Здесь шаги, которые я предпринял

Новая таблица

CREATE TABLE  `cars` (
  `ID` int(10) unsigned NOT NULL auto_increment,
  `color` varchar(45) NOT NULL,
  `name` varchar(45) NOT NULL,
  `enabled` varchar(45) NOT NULL,
  PRIMARY KEY  (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

Затем добавлены значения

INSERT INTO `cars` (`ID`, `color`, `name`, `enabled`) VALUES
  (1,'red','red car','yes')
, (2,'blue','blue car','yes')
, (3,'brown','brown car','yes');

Затем тестирование запросов

mysql> SELECT * FROM  `cars`
    ->  WHERE (color LIKE '%red%' OR name LIKE '%red%')
    ->    AND enabled = 'yes'
    ->  ORDER BY  `ID`;
+----+-------+---------+---------+
| ID | color | name    | enabled |
+----+-------+---------+---------+
|  1 | red   | red car | yes     |
+----+-------+---------+---------+
1 row in set (0.00 sec)

mysql> SELECT * FROM  `cars`
    ->  WHERE (color LIKE '%red car%' OR name LIKE '%red car%')
    ->    AND enabled = 'yes'
    ->  ORDER BY  `ID`;
+----+-------+---------+---------+
| ID | color | name    | enabled |
+----+-------+---------+---------+
|  1 | red   | red car | yes     |
+----+-------+---------+---------+
1 row in set (0.00 sec)

Возможно, посмотрите в другом месте для вашей ошибки

  • 0
    так в чем была проблема?
  • 0
    проблема в том, что $ key становится пустым, если $ _GET ['key'] содержит более 1 слова: S
2

"РЕДАКТИРОВАТЬ 2: Питер прав. problen в запросе. странная вещь, я использую это

$key = $_GET ['key'];

если $_GET ['key'] - более 1 слова, $key возвращает пустую причину."

Как вы проходите в $_GET? Используете ли вы форму или просто вводите свои переменные

blah.php? key = test + и

НЕ

blah.php? key = test и

  • 0
    да, это была проблема, я передаю его с функцией загрузки запроса, чем я понял, что пробелы должны быть заменены на "+", тогда я использовал функцию замены javascript, и теперь она работает отлично, спасибо всем
1

Вы можете использовать подготовленный оператор для предотвращения SQL-инъекции:

$statement = $db_connection->prepare("SELECT * FROM  `cars` WHERE  (color LIKE ? OR name LIKE ?) AND enabled = 'yes'  ORDER BY  `ID`");
$statement->bind_param("s", "%".$key."%");
$statement->execute();
  • 0
    эй спасибо за это
0

Ваш SQL неверен:

$query = "SELECT * FROM  `cars` WHERE  (color LIKE '%". $key ."%' OR name LIKE '%". $key ."%') AND enabled = 'yes'  ORDER BY  `ID`";

Вам нужно поместить цвет и имя в скобки, иначе вы можете найти, что вы вернете строки, если поле включено.

  • 0
    я исправил это, спасибо

Ещё вопросы

Сообщество Overcoder
Наверх
Меню