2016-10-27 2 views
0

Я хотел бы создать поисковую систему, которая отображает результаты по ранжированию preset. Рейтинг состоит из двух частей: 1. Количество просмотров сообщений (представлено POP [INT] в таблице «post») и количество слов в самом тексте (представлено TXT [STRING] в таблице «post»).Оценка результатов поиска путем подсчета слов, связанных с PDO/SQL

То есть, если существует три Результатов

//$search = 'apple macbook'; 
  1. 3 хитов (POP) и 3 ключевых слов, связанных (2 Macbook, 1 яблоко найдено в TXT) = - будут представлены
  2. 2 посещения (POP) и 3 ключевых слов, связанных (1 MACBOOK, 1 APPLE найдено в TXT) = - будет представлен Второй
  3. 2 хитов (POP) и 1 ключевых слов, связанных (1 APPLE найти в TXT) = - будет представлен Третий

Мой код :

$search = isset($_GET['s']) ? htmlspecialchars($_GET['s']) : ''; 
$search = strtoupper($search); 
$search = strip_tags($search); 
$search = trim($search); 
$words = explode(' ', $search); 
$words_condition = array(); 
$arguments = array(); 
foreach ($words as $word) { 
    $words_condition[] = 'TXT LIKE ?'; 
    $arguments[] = '%'.$word.'%'; 
} 

    $query = $db->prepare("SELECT * FROM `post` WHERE ".implode(" OR ", 
    $words_condition)." ORDER BY POP DESC"); $query->execute($arguments); 

О моей таблицы структуры ("пост" таблицы) есть 4 Co lumn ...

  1. ID [INT] 2. SUB (тема поста) [STRING] 3. TXT (тело/полный текст) [STRING] 4. POP [INT] (хитов визита эта почта).
+0

Можете ли вы дать нам свою структуру стола? – Philipp

+0

Вы не используете подготовленные операторы правильно. Просто конкатенируя поисковые термины, вы по-прежнему уязвимы для SQL-инъекции – Philipp

+0

@Philipp благодарит вас за ваш комментарий .. о моей структуре таблицы (столбец «post») есть 4 столбца ... 1. ID [INT] 2. SUB (предмет сообщения) [STRING] 3. TXT (тело/полный текст) [STRING] 4. POP [INT] (хиты посещения этого сообщения). – TheQuestionerMan

ответ

0
CREATE TABLE post (id INT, txt varchar(100), pop int); 
INSERT INTO post VALUES (1, "key key cle cle", 1); 
INSERT INTO post VALUES (2, "key key cle cle", 2); 
INSERT INTO post VALUES (3, "key key cle", 2); 
INSERT INTO post VALUES (4, "key cle cle", 1); 

SELECT *, (LENGTH(txt) - LENGTH(replace(txt, 'cle', '')))/LENGTH("cle") as cle, 
    (LENGTH(txt) - LENGTH(replace(txt, 'key', '')))/LENGTH("key") as key, 
    (LENGTH(txt) - LENGTH(replace(txt, 'cle', '')))/LENGTH("cle")+(LENGTH(txt) - LENGTH(replace(txt, 'key', '')))/LENGTH("key") as nbKW 
FROM post 
ORDER BY nbKW DESC, pop DESC; 

ОК я проверить его, и он работает очень хорошо! Вы должны приспособить его к своим аргументам!

+0

Привет .. спасибо за ваш новый ответ ... это две основные проблемы ... 1. Что случилось, если какой-то поиск 5 или неограниченное количество слов? Ваш запрос будет работать только для 2-х слов. 2. Как насчет внедрения sql (слова поступают из поискового механизма с помощью метода GET) TIA – TheQuestionerMan

+0

Вам нужно адаптировать его, чтобы ваш foreach ($ word) заполнил «select part» запроса. –

+0

Но как? Я не понимаю – TheQuestionerMan

Смежные вопросы