SQL LIKE-запрос для соответствия любому отдельному слову в строке - PullRequest
0 голосов
/ 04 мая 2011

Я пытаюсь запросить:

$title2 = (isset($row_DetailRS1['r_bus_name']) ? $row_DetailRS1['r_bus_name'] : "");

$query_test = "SELECT * 
                 FROM table 
                WHERE r_email = '$email2' 
                  AND r_city != '$location2' 
                  AND r_bus_name LIKE '%$title2%' 
             ORDER BY r_bus_name";

r_bus_name LIKE '%$title2' определено сверху и захватывает НАЗВАНИЕ СОБЫТИЯ из ПОЧТЫ.Заголовок обычно состоит из двух-трех слов ...

Как мне запросить r_bus_name LIKE (any of the words in the event title $title2)?

Потому что сейчас он принимает целое значение $ title2 .. Мне нужно их разделитьвверх или взорвать их словами, так что если заголовок будет что-то вроде «Test title here», тогда «Tester title here» будет соответствовать?

Ответы [ 3 ]

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

Разделить title2 на пробелы и сделать несколько лайков:

$titleArray = split(" ", $title2);

$query_test = "SELECT * 
                 FROM table 
                WHERE r_email = '$email2' 
                 AND r_city != '$location2'
                 AND ("
    foreach ($title as titleArray)
        $query_test .= "OR r_bus_name LIKE '%$title%'" 
$query_test .= "ORDER BY r_bus_name";
0 голосов
/ 04 мая 2011

Если вы хотите искать по КАЖДОМУ слов в заголовке, вам нужно будет создать запрос, используя операции ИЛИ , чтобы применить их к тому же запросу.

Это может выглядеть примерно так:

// break apart the title using spaces
$title2 = (isset($row_DetailRS1['r_bus_name']) ? $row_DetailRS1['r_bus_name'] : "");
$title_keywords = explode(" ", $title2);

// construct conditions (Note the ampersand causes pass-by-reference)
foreach($title_keywords as &$keyword) {
    $keyword = "r_bus_name LIKE '%".mysql_real_escape_string($keyword)."%'";
}
$keyword_search = "(" . implode(" OR ", $title_keywords) . ")";

$query_test = "SELECT * 
    FROM table 
    WHERE r_email = '".mysql_real_escape_string($email2)."' 
        AND r_city != '".mysql_real_escape_string($location2)."' 
        AND ".$keyword_search." 
    ORDER BY r_bus_name";

// ...
0 голосов
/ 04 мая 2011

Предполагая, что таблица - MyISAM, вы можете использовать встроенную функцию полнотекстового поиска (FTS) :

$query = sprintf("SELECT t.* 
                    FROM YOUR_TABLE t
                   WHERE t.r_email = '%s' 
                     AND t.r_city != '%s' 
                     AND MATCH(t.r_bus_name) AGAINST('%s')
                ORDER BY t.r_bus_name",
                 mysql_real_escape_string($email2),
                 mysql_real_escape_string($location2),
                 mysql_real_escape_string($title2) );

$result = mysql_query($query);

К сожалению, MySQL не поддерживает FTS на движке InnoDB.

Приложение

Я рекомендую использовать sprintf , если вы не используете PDO / etc для подготовленных операторов, для защиты от атак внедрения SQL.

...