|
|
|
Не учитывать пробелы при поиске по бд (Virtuemart)
|
|||
|---|---|---|---|
|
#18+
авторЗдравствуйте дорогие ГУРУ! ) Есть у меня скрипт интернет магазина, который использует БД MySQL(virtuemart). Сам я с SQL не дружу, может кто нибудь подскажет как сделать, чтобы при запросе поиска не учитывались пробелы и тире. Т.е. например если я ищу 1234567 то все нормально находит, а если написать 12-345 67, чтобы выдавался тот же результат, что и при 1234567 Вот обращение из пхп к базе $keywordArr = vmGetCleanArrayFromKeyword( $keyword ); if( !empty($keywordArr) ) { $sq = "("; $numKeywords = count( $keywordArr ); $i = 1; foreach( $keywordArr as $searchstring ) { $sq .= "\n `#__{vm}_product`.`product_sku` LIKE '$searchstring' "; if( $i++ < $numKeywords ) { $sq .= "\n AND "; } } $sq .= ")"; $where_clause[] = $sq; } Заранее спасибо за помощь. -------------------------------------------------- Привет всем! Поднимаю закрытую тему, т.к. вижу, что за 2 года задача так и не решена. У меня интернет-магазин автозапчастей на virtuemart joomla. Подобная проблема стала очень актуальной, т.к. поиск по базе ведётся по номерам запчастей, которые в оригинале имеют разделители "-", ".", а также пробел между цифрами " ". По своей природной лени стал искать готовые решения по форумам, но с удивлением понял, что решение готового не существует. Функция str_replace прекрасно справляется со своими обязанностями, но в данном случае возникла закавыка, она заменяет любые символы, кроме пробелов. Т.к. функция рабочая (но по факту в данном случае не работает), я логически предположил, что существует где-то функция в другом файле, которая нивелирует все попытки применить её для пробела. Этой функцией оказался explode, который возвращает массив строк, полученных разбиением строки, с использованием delimiter в качестве разделителя, который в свою очередь имеет значение пробела " ". Потому все потуги по replace-замене были априори обречены. Привожу код файла виновника administrator/components/com_virtuemart/classes/ps_main.php: function vmGetCleanArrayFromKeyword( $keyword ) { global $database; $keywordArr = array(); if( empty( $keyword )) return $keywordArr; $keywords = explode( ",", $keyword, 10 ); //заменил разделитель вместо пробела запятой (символ, который не используется в моих номерах при поиске, можно подставить любой символ, который вы не хотите заменять) foreach( $keywords as $searchstring ) { $searchstring = trim( stripslashes($searchstring) ); $strlen = strlen($searchstring); if( $strlen > 2 ) { /*if( $searchstring[0] == "\"" || $searchstring[0]=="'" ) { $searchstring[0] = " "; } if( $searchstring[strlen($searchstring)-1] == "\"" || $searchstring[strlen($searchstring)-1]=="'" ) { $searchstring[strlen($searchstring)-1] = " "; }*/ $searchstring = $database->getEscaped( $searchstring ); $searchstring = str_replace('\"', '"', $searchstring ); $keywordArr[] = $searchstring; } } return $keywordArr; } ----------------- Дальше код файла, который уже приводился участником форума нерешённой темы (мои риплейсы, которые актуальны для меня, по желанию подставляем своё) administrator/components/com_virtuemart/html/shop_browse_queries.php: if( !empty($keywordArr) ) { $sq = "("; $numKeywords = count( $keywordArr ); $keywordArr = str_replace('-','', $keywordArr); $keywordArr = str_replace('.','',$keywordArr); $keywordArr = str_replace('–','',$keywordArr); $keywordArr = str_replace(' ', '', $keywordArr); $i = 1; foreach( $keywordArr as $searchstring ) { $sq .= "\n (`#__{vm}_product`.`product_name` LIKE '%$searchstring%' OR "; $sq .= "\n `#__{vm}_product`.`product_sku` LIKE '$searchstring' OR"; //$sq .= "\n `#__{vm}_product`.`product_s_desc` LIKE '$searchstring' OR "; $sq .= "\n `#__{vm}_product`.`product_desc` LIKE '%$searchstring%' ) "; if( $i++ < $numKeywords ) { $sq .= "\n AND "; } } $sq .= ")"; $where_clause[] = $sq; } --------------- Желаю всем удачи! Может, кому пригодится. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2013, 00:25:08 |
|
||
|
|

start [/forum/topic.php?fid=47&fpage=196&tid=1835582]: |
0ms |
get settings: |
7ms |
get forum list: |
19ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
35ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
39ms |
get tp. blocked users: |
1ms |
| others: | 217ms |
| total: | 338ms |

| 0 / 0 |
