tomclancys
@tomclancys

Как сделать через PHP поиск по таблице MySQL чтобы не учитывались пробелы, точки и запятые в самой таблице?

В базе данных пробую искать адреса. Адреса в базе храняться в таком виде:
г. Пермь, ул. Мира, д.4
г. Пермь, ул. Мира, д.24
г. Пермь, ул. Кузьмина, д.51

В форме поиска допустим вводим "Мира 24" без запятых и точек и жмём найти. В таком виде ничего не находит. Если делаю как в базе данных с запятыми и точками, то находит.

Вопрос, как сделать через PHP поиск по таблице MySQL чтобы не учитывались пробелы, точки и запятые в самой таблице?

$text =$filter['title']; 
$rows = intersectorsearch::all_metka($text);

public static  function all_metka($text = ''){ 
   $db=JFactory::getDBO();

    $query = $db->getQuery(true);	  
  	$query->select(
			 "prod.fio, a.adres, prod.title, prod.kab, prod.tel, kat.title as kat_title, a.latlongmet");
		$query->from('`#__intersectorsearch_adres` AS a') 
        ->join('LEFT', '#__intersectorsearch_prod AS prod ON a.prod = prod.id')
        ->join('LEFT', '#__intersectorsearch_kat AS kat ON prod.kat = kat.id');
         $query->where('prod.published=1');
         
         if (!$text)
         $search = JRequest::getVar('text');
         else
         $search =  $text;
                
         if ($search){
            $search = $db->Quote('%'.$db->escape($search, true).'%');
          $query->where('( prod.title LIKE '.$search.' ) OR ( a.adres LIKE '.$search.' ) OR ( prod.fio LIKE '.$search.')');
         }

         $db->setQuery($query);
         return $db->loadObjectList();   
   }
  • Вопрос задан
  • 1087 просмотров
Решения вопроса 1
wagoodoogoo
@wagoodoogoo
prestahop, webix, phalcon, vue, slim, craft cms
LIKE для однословного поиска для многословного лучше делать поля FULLTEXT

https://dev.mysql.com/doc/refman/8.0/en/fulltext-n...

потом по ним поиск

если совсем некрасиво, но нужно, то бить по словам и потом собирать запрос как-то так:
if ($search){
$words = explode(' ', $search);
foreach ($words as $word) {
    $search = $db->Quote('%'.$db->escape( $word, true).'%');
    $conds1[] = ' prod.title LIKE '.$search;
$conds2[] = ' a.adres LIKE '.$search;
$conds3[] = ' prod.fio LIKE '.$search;
}
$query1 = implode(' OR ', $conds1);
$query2 = implode(' OR ', $conds2);
$query3 = implode(' OR ', $conds3);
$query->where('( '.$query1.' ) OR ( '.$query2.' ) OR ( '.$query3.')');
}


или можно REGEXP функцию по такому же принципу написать
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
iiiBird
@iiiBird
Пока ты спишь - твой конкурент совершенствуется
для этого давно есть готовые решения. к примеру twitter.github.io/typeahead.js/examples
в общем гугли по запросу "typeahead"
Ответ написан
@wAML
Любое чисто SQL решение для текущей задачи будет некорректным. Ибо за ней всплывет следующая, а чего это у меня все тупит. Минимальное решение - добавить 3 поля город/улица/дом, один раз пробежаться и раскидать данные по полям, предварительно преобразовав к нижнему/верхнему регистру. После этого поиск уже будет +/- вменяемым.
Как вариант, в этих полях держать не текст, а unsign crc32 хеши ( sprintf('%u',crc32(...)) ).
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы