поиск php через поля mysql для совпадения строк - PullRequest
1 голос
/ 22 апреля 2011

У меня есть поле ввода, в котором можно ввести и найти несколько слов в моей таблице.

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

то, что у меня есть (многое упущено и, возможно, даже не правильный метод):

$lcSearchVal = "people places things";
$lcSearchVal = explode( ' ', $lcSearchVal );

foreach( $lcSearchVal as $lcSearchWord ){
   $qry_suggest = mysql_query( 'SELECT * FROM nouns
                            WHERE Active 
                            AND ( ' . strpos($lcSearchWord, "description") > 0 . '
                               OR ' . strpos($lcSearchWord, "title") > 0 . ' ) '
                            );
}

Я не уверен, что делать или куда идти отсюда .... пожалуйста, помогите!

Ответы [ 2 ]

3 голосов
/ 22 апреля 2011

Используемый вами запрос не будет работать - вы используете функции PHP для сравнения с простой строкой и добавляете результат этого сравнения в свой запрос. Все, что увидит БД, это:

SELECT * FROM nouns WHERE Active AND (-1 OR 0)

... потому что функция php strpos возвращает числовую позицию найденной строки (или -1, если не найден. Вам нужно использовать функции сравнения в самой базе данных, поэтому вы не после функций php в все, скорее вы хотите функции сравнения MySQL.

Для справки, вот их список: http://dev.mysql.com/doc/refman/5.0/en/comparison-operators.html

Вот пример, который очень просто ищет совпадения. Вы можете немного улучшить этот код, но это должно дать вам представление:

$lcSearchVal = "people places things";
$lcSearchVal = explode( ' ', $lcSearchVal );

$sql = 'SELECT * FROM nouns WHERE Active=1 AND (';

$parts = array();
foreach( $lcSearchVal as $lcSearchWord ){
    $parts[] = '`description` LIKE "%'.$lcSearchWord.'%"';
    $parts[] = '`title` LIKE "%'.$lcSearchWord.'%"';
}

$sql .= implode(' OR ', $parts).')';
print $sql;

Возиться с этим: http://codepad.org/fcNH5qyu

Также обратите внимание, что ваше предложение WHERE Active недопустимо - вы должны сравнить его. В моем примере я предположил, что поле Active является числовым 1 или 0.

0 голосов
/ 22 апреля 2011

Вы не можете смешивать функции PHP с SQL таким образом.Ваш запрос будет выглядеть примерно так:

... WHERE Active AND (1 or 0) ...

Я предполагаю, что вы захотите что-то вроде этого:

$lcSearchWord = mysql_real_escape_string($lcSearchWord);

... WHERE Active=1 AND (description LIKE '%$lcSearchWord$%' OR title LIKE '%$lcSearchWord$%') ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...