PHP, MySQL: сделать лучший поиск? - PullRequest
1 голос
/ 04 мая 2011

Я сделал функцию окна поиска, которая позволяет мне вводить слово, а затем он находит любые совпадения слова в моей базе данных.Тем не менее, он находит только точные совпадения.Я ищу предложения о том, как сделать поиск лучше.

Код ниже - это то, что я сейчас использую для поиска в базах данных пользователей, которые могут совпадать с поиском пользователя.

    $search_keys = array('fname', 'lname', 'email' );

    foreach ( $search_keys as $key )
    {
        $result = mysql_query( "SELECT id FROM users WHERE " . $key . " LIKE " . "\"{$str}\"" ) or die(mysql_error());

        while ( $row = mysql_fetch_array( $result ) )
        {

            // Get the User
            $tmp_user = new User();
            $tmp_user->getUserById( $row['id'] );

            // Add User to list of potential candidates
            array_push($users, $tmp_user);
        }
    }

Ответы [ 4 ]

3 голосов
/ 04 мая 2011

Я вижу две точки, где вы можете улучшить свой фрагмент кода. Но прежде всего позаботьтесь о том, чтобы $ str был правильно отформатирован для безопасного использования в вашем запросе SQL. В противном случае вы столкнетесь с проблемой под названием SQL-инъекция . Я предполагаю, что теперь для вашего кода.

  1. Используйте подстановочные знаки с функцией LIKE SQL .
  2. Поиск по трем полям с помощью одного SQL-запроса.

Пожалуйста, посмотрите пример кода, который содержит оба предложения. Сначала выполняется SQL-запрос. Необходимо выполнить только один запрос для всех (трех) полей вместо одного запроса для каждого поля. Это полезно, если вы расширите свой поиск позже.

/* build SQL query */
$conditions = array();
$search_keys = array('fname', 'lname', 'email' );
foreach ( $search_keys as $key )
{
    $conditions[] = "{$key} LIKE \"%{$str}%\""; # Wildcard (%); [] works like array_push()
}
$query = sprintf('SELECT id FROM users WHERE (%s)', implode(' OR ', $conditions));

/* run SQL query */
$result = mysql_query($query) or die(mysql_error());
while ( $row = mysql_fetch_array( $result ) )
{
    // Get the User
    $tmp_user = new User();
    $tmp_user->getUserById( $row['id'] );

    // Add User to list of potential candidates
    array_push($users, $tmp_user);
}
2 голосов
/ 04 мая 2011

Я бы предложил использовать полнотекстовую базу данных как solr или sphinx для такого поведения. Если вы не можете или не хотите устанавливать его, вы должны добавить% к вашему коду. $ result = mysql_query ("ВЫБЕРИТЕ ID ИЗ ГДЕ пользователей". $ key. "LIKE". "\"% {$ str}% \ "") или die (mysql_error ());

2 голосов
/ 04 мая 2011

Ну, всегда есть самый простой способ добавления оператора с подстановочными знаками, поэтому, если они введут 'Jam', это будет

SELECT id FROM users WHERE fname LIKE '%Jam%'
etc...

РЕДАКТИРОВАТЬ: Суть в том, что он возвращает совпадение на JAMIE, JAMES, LogJam или (вы понимаете), что означает, что им не нужно запоминать полное имя, только некоторую его часть.

1 голос
/ 04 мая 2011

вы должны попробовать

$result = mysql_query( "SELECT id FROM users WHERE " . $key . " LIKE " . "%" . $str . "%" ) or die(mysql_error());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...