PHP поиск с использованием нескольких слов - PullRequest
1 голос
/ 04 ноября 2011

Я пытаюсь создать функцию поиска, в которой пользователь может ввести два слова в текстовое поле, и это разделит слова и создаст запрос MySQL.

Это то, что у меня есть до сих пор.

$search     = mysql_real_escape_string( $_POST['text_field']);
$search     = explode(" ", $search);

foreach($search as $word)
{
    $where = "";
    $where      .= "product_code LIKE '%". $word ."%'";
    $where      .= "OR description LIKE '%". $word ."%'";

    $query      = "SELECT * FROM customers WHERE $where";
    $result     = mysql_query($query) or die();

    if(mysql_num_rows($result))
    {
        while($row = mysql_fetch_assoc($result))
        {
            $customer['value']  = $row['id'];
            $customer['label']  = "{$row['id']}, {$row['name']} {$row['age']}";
            $matches[]          = $customer;
        }
    }
    else
    {
        $customer['value']  = "";
        $customer['label']  = "No matches found.";
        $matches[]          = $customer;
    }
}

$matches = array_slice($matches, 0, 5); //return only 5 results

Создает и запускает запрос, но возвращает забавные результаты.

Любая помощь будет принята.

Ответы [ 3 ]

1 голос
/ 04 ноября 2011
  1. В MySQL есть что-то под названием LIMIT, поэтому последняя строка будет ненужной.

  2. Используйте полнотекстовый поиск для этого: http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html - это быстрее и элегантнее

0 голосов
/ 04 ноября 2011

Есть ли шансы на что-то более конкретное, чем "забавные результаты"?У манжета есть несколько возможностей, но это действительно зависит от результатов, которые возвращаются.Мой PHP немного заржавел, поэтому я заранее извинюсь, если вместо этого мой мозг добавит некоторые java-правила, но на первый взгляд ...

Назовите массив как-то, кроме $ searchВероятно, это не проблема, но выглядит странным, что массив, созданный посредством explode (), содержит имя разрываемой строки.Попробуйте что-то вроде $ search = explode ("", $ search);и затем используйте $ search в последующем цикле foreach ().

Что если пользователь вводит только один поисковый запрос?Если в $ text_field нет места, то explode вернет пустой массив, который должен полностью испортить ваш запрос.Вы должны по крайней мере убедиться, что в $ text_field есть пробел, прежде чем взорвать $ search.Аналогично, что, если пользователь вводит два поисковых слова, но одно из этих слов состоит из двух слов, разделенных пробелом?Опять же, вы получите «забавные результаты», потому что вы получите нежелательные результаты, а также дублированные результаты, так как запрос распространяется на оба слова в термине по отдельности.что вы имеете в виду под «забавными результатами», действительно трудно с этим справиться.

0 голосов
/ 04 ноября 2011

Если ваша база данных имеет формат таблицы MyISAM, вы можете выполнить полнотекстовый поиск по интересующим вас столбцам, поскольку Sn0opy уже упоминал

Лично я считаю, что когда речь заходит о MySQL, если вы действительно хотите создать отличныйпоисковая система использует Sphinx (http://sphinxsearch.com/) или Solr (http://lucene.apache.org/solr/)

). Возможно, на обоих из них может быть обучение, но результаты профессиональные.

...