Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Не учитывать пробелы при поиске по бд (Virtuemart) / 2 сообщений из 2, страница 1 из 1
08.12.2013, 00:25:08
    #38493006
eagla888
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не учитывать пробелы при поиске по бд (Virtuemart)
авторЗдравствуйте дорогие ГУРУ! )

Есть у меня скрипт интернет магазина, который использует БД 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;
}
---------------
Желаю всем удачи!
Может, кому пригодится.
...
Рейтинг: 0 / 0
08.12.2013, 06:50:23
    #38493111
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не учитывать пробелы при поиске по бд (Virtuemart)
eagla888,

простите, а при чём тут mysql?
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Не учитывать пробелы при поиске по бд (Virtuemart) / 2 сообщений из 2, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]