вопрос поиска в базе данных PHP - PullRequest
0 голосов
/ 15 декабря 2009

мой код такой,

$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

г

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

как мне найти оба поля?

спасибо

РЕДАКТИРОВАТЬ: я установил квадратные скобки, но все еще не могу получить результаты, используя более 1 слов ключей.

Попробовал без удачи

  $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 слова, $ key возвращается пустым по причине.

Ответы [ 4 ]

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

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

$ key = $ _GET ['key'];

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

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

blah.php? Key = test + и

НЕ

blah.php? Key = test и

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

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

Новый стол

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)

Может быть, искать в другом месте вашу ошибку

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

Вы можете использовать подготовленный оператор для предотвращения внедрения 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 голосов
/ 15 декабря 2009

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

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

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

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