Понедельников НЕТ!
Регистрация или вход Регистрация или вход Избранное на этом сайте | Главная | Анкета | Рекомендовать | Обратная связь | В избранное | Сделать домашней
Скачать SSDForums
Скачать SSDForums 1.0.1 Скачать SSDForums 1.0.1
Скачать SSDForums 1.0.1 SP1 Скачать SSDForums 1.0.1 SP1
Скачать SSDForums 1.0.1 SP2 Скачать SSDForums 1.0.1 SP2
SSD Forums 1.0.1 SP3 only Slaed 3.5 Pro SSD Forums 1.0.1 SP3 only Slaed 3.5 Pro
SSD Forums 1.0.1 SP4-beta only Slaed 4.1 Pro SSD Forums 1.0.1 SP4-beta only Slaed 4.1 Pro
Jewelry Сase Team
Скачать Ruby Chat 0.1.1 Скачать Ruby Chat 0.1.1
Меню
Главная
Форум
Магазин цифровых товаров

Новости
Подписка на новости
Темы новостей
Добавить новость

Каталог файлов
Карта файлового архива
Публикации

Опросы
Анкета пользователя
Чат

BestMaker
Викторина
Архив новостей
Карманный оракул
Поиск по сайту с помощью Яндекс
Поиск по сайту с помощью Google
Фото дня
Для души
Погода на 3 дня
IndexCat
IndexTop
Map_Pages
Поиск по сайту









Подписка на новости
Ваше имя:
Ваш E-Mail:*
Секретный код:
Секретный код
Повторить:*
Интересное в сети

Sape — это система купли-продажи ссылок
с главных и внутренних страниц сайтов
Форум -> Обо всём... -> Поиск по всему словосочетанию и не по 1 слову
Поиск по всему словосочетанию и не по 1 слову
decide Дата: 06.08.2009, в 22:36 | Сообщение №1
decide
Пользователь
Пользователь №: 471
Сообщений: 30

беда вот какая. Например есть каталог музыки. Название группы Состоит из пары слов, например:

The Cavalera Conspiracy
The Rasmus
The Agony Scene
the Chemodan

В базе есть поле $performer - это и есть название исполнителя (модуль music с этого сайта)
Чтобы например вывести все творения конкретного исполнителя я сделал так

PHP - Код
1
2
3
<?php
<a href=index.php?name=$module_name&op=search2_q&rus=$performer>$performer</a>
?>


но при наведении на ссылку, видно, что искать будет только первую часть названия, т.е. в нашем случае это the.


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


Приведу на всякий случай всю функцию search2_q
PHP - Код
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
<?php
function search2_q() {
global
$prefix, $db, $module_name, $rus, $eng, $pagetitle, $defis;
$pagetitle = "$defis "._MUSIC_LOGO." $defis "._search2."";
head();
menu();
    
OpenTable();
    if (
$rus!=''){
    
$lang='performer';
    
$letter=$rus;
    }else if(
$eng !=''){
    
$lang='performer';
    
$letter=$eng;
    }
    
$result = $db->sql_query("SELECT lid, cid, performer, title, filesize, filetype, hits, votes, totalvotes FROM ".$prefix."_music WHERE status != '0' AND $lang Like '$letter%' ORDER BY lid");
    
$nrows = $db->sql_numrows($result);
    
$lid = intval($lid);
    
$cid = intval(trim($cid));
    
$x=0;
    
$the_query = stripslashes($query);
    
$the_query = str_replace("\'", "'", $the_query);
    if (
$nrows>0) {
    
$a = 1;
    echo
"<center><b>"._search2." ($letter):</b></center>" ;
   echo
"<table  border=\"0\" cellspacing=\"1\" cellpadding=\"3\" class=\"bgcolor4\"><tr><th width=\"100\">"._P_MNAME."</th><th width=\"10%\">"._SIZE."</th><th width=\"2%\">"._FORM."</th><th width=\"10%\">"._REITING."</th><th width=\"5%\">"._HITS."</th></tr>";

     while(list(
$lid, $cid, $performer, $title, $filesize, $filetype, $hits, $votes, $totalvotes) = $db->sql_fetchrow($result)) {
    echo
"<tr><td  class=\"bgcolor1\"><li>$a: <a href=index.php?name=$module_name&op=search2_q&rus=$performer>$performer</a><a href=index.php?name=Music&op=view_music&lid=$lid> - $title</a></li></a></td>
    <td  class=\"bgcolor1\"><div align=\"center\"><small>"
.files_size($filesize)."</small></div></a></td>
    <td  class=\"bgcolor1\"><div align=\"center\">"
.mimetype("$filetype")."</div></a></td>
    <td  class=\"bgcolor1\"><div align=\"center\">"
.reiting($votes, $totalvotes)."</div></td>
    <td  class=\"bgcolor1\"><div align=\"center\">
$hits</div></td>";
    
$a++;
    }
     echo
"";
    } else {
    echo
"
    }

echo"
</td></tr></table>";
CloseTable();
foot();
}
?>


_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
Отредактированно decide 06.08.2009 г. в 22:37:55
Serg_pnz Дата: 06.08.2009, в 23:56 | Сообщение №2
Serg_pnz
Администратор
Пользователь №: 1
Сообщений: 2242

Например такая логика: бить на массив по пробелу и составлять из этого условие на запрос.

Не все кальсоны с оторванными пуговицами - брюки. © Serg_pnz
"...даме водки? Это чистый спирт!" © кот Бегемот
decide Дата: 07.08.2009, в 09:31 | Сообщение №3
decide
Пользователь
Пользователь №: 471
Сообщений: 30

Тезка, к полному моему сожалению в пхп = я полный 1 (по 10 бальной системе). Могу лишь смутно догадываться для чего какая функция :(

Ты не мог бы привести пример решения, если не сложно.
Serg_pnz Дата: 07.08.2009, в 10:19 | Сообщение №4
Serg_pnz
Администратор
Пользователь №: 1
Сообщений: 2242

Всё зависит от хотелок.
Можно сделать поиск по полным словам и по фрагментам заключенным/начинающимся/заканчивающимся на звёздочку.
Постараюсь в течении дня написать универсальную функцию.

Не все кальсоны с оторванными пуговицами - брюки. © Serg_pnz
"...даме водки? Это чистый спирт!" © кот Бегемот
decide Дата: 07.08.2009, в 10:43 | Сообщение №5
decide
Пользователь
Пользователь №: 471
Сообщений: 30

я буду тебе весьма и весьма признателен
Serg_pnz Дата: 07.08.2009, в 12:35 | Сообщение №6
Serg_pnz
Администратор
Пользователь №: 1
Сообщений: 2242

Предлагаю такой вариант. Если нужен поиск по целому слову, то перед этим словом должен стоять восклицательный знак. Слова в запросе объединяются по "И".

PHP - Код
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
<?php
//исходные данные
$str = '!*Ст!р#$о.?ка *пОИс&$8*ка 22 3ри* !*чет&^$ыре пять шесть семь';
$name = 'pole_name';

//вызываем функцию и смотрим результат
$rez_comb = combine ($str, $name);
echo
$rez_comb;


//функция обработки и составления поисковой строки
function  
    
combine (
        
//строка
        
$str,
        
//имя поля
        
$name
    
) {

//ограничиваем длинну строки, дабы не было поисковой нагрузки
$str = substr($str, 0, 80);

//по пробелу делим строку на массив
$m = explode(' ', trim($str));

//прогон массива и удаление из него всего, что короче 3-х символов
//учитываем только буквы и цифры
foreach ($m as $key => $val) {
    
$tmp = preg_replace('#[^A-Za-zА-Яа-я0-0]#i', '', $val);
    if ( (
strlen($tmp))<3 ) unset($m[$key]);
}

//ограничиваем поисковую нагрузку до четырех слов
$k = count($m);
if (
$k>4) $k=4;

//составляем запрос в базу
for ($i=1; $i<=$k; $i++) {

    
//берем очередной элемент отфильтрованного массива
    
$tmp = array_shift($m);
    
    
//берем флаги на поиск
    
$flag1 = $tmp{0};
    
$flag2 = substr($tmp, -1);
    
    
//освобождаемся от спец-символов в словах на поиск
    
$tmp = preg_replace('#[^A-Za-zА-Яа-я0-0]#i', '', $tmp);

    if (
$flag1=='!') $out[] = '( '.$name.'=\''.$tmp.'\' OR '.$name.' Like \''.$tmp.' %\'  OR '.$name.' Like \'% '.$tmp.'\')';
    else
$out[] = '( '.$name.' Like \'%'.$tmp.'%\')';
}

//объеденяем и возвращаем результат
return implode(' AND ', $out);
}

//вспомогательная функция для просмотра массива
function  pre($in) {
    echo
'<pre>';
        
print_r($in);
    echo
'</pre>';
}
?>


Функция вернёт
Цитата
( pole_name='Строка' OR pole_name Like 'Строка %' OR pole_name Like '% Строка') AND ( pole_name Like '%пОИска%') AND ( pole_name='четыре' OR pole_name Like 'четыре %' OR pole_name Like '% четыре') AND ( pole_name Like '%пять%')


_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
Отредактированно Serg_pnz 07.08.2009 г. в 12:36:18

Не все кальсоны с оторванными пуговицами - брюки. © Serg_pnz
"...даме водки? Это чистый спирт!" © кот Бегемот
decide Дата: 07.08.2009, в 13:08 | Сообщение №7
decide
Пользователь
Пользователь №: 471
Сообщений: 30

СПасибо Serg_pnz тебе за труды, но однако воспользоваться к сожалению не могу, думалки не хватает.

Скажи так, тот поиск который приведен мной выше модернизации не подлежит, для получения нужного результата ?
Serg_pnz Дата: 07.08.2009, в 15:12 | Сообщение №8
Serg_pnz
Администратор
Пользователь №: 1
Сообщений: 2242

decide,
1. скопируй к себе в модуль мою функцию
Код
1
function combine ($str, $name) {
...
}


2. юзай этот фрагмент так
Код
1
if ($rus!=''){
    $lang='performer';
    $letter=combine ($rus, $lang);
    }else if($eng !=''){
    $lang='performer';
    $letter=combine ($eng, $lang);
    }
    $result = $db->sql_query("SELECT lid, cid, performer, title, filesize, filetype, hits, votes, totalvotes FROM ".$prefix."_music WHERE status != '0' AND '$letter' ORDER BY lid");


Обрати внимание что в п.2 изменения и в условии, и в запросе.

Не все кальсоны с оторванными пуговицами - брюки. © Serg_pnz
"...даме водки? Это чистый спирт!" © кот Бегемот
decide Дата: 07.08.2009, в 21:05 | Сообщение №9
decide
Пользователь
Пользователь №: 471
Сообщений: 30

вообщем позволю себе еще потупить

мысли вслух , так сказать.

в тело индекса , там где функция поиска, которую я приводил в первом посте, добавляю следующую функцию
PHP - Код
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<?php
function  combine ($str, $name)
{

$str = substr($str, 0, 80);
$m = explode(' ', trim($str));

foreach (
$m as $key => $val) {
    
$tmp = preg_replace('#[^A-Za-zА-Яа-я0-0]#i', '', $val);
    if ( (
strlen($tmp))<3 ) unset($m[$key]);
}

$k = count($m);
if (
$k>4) $k=4;
for (
$i=1; $i<=$k; $i++) {
    
$tmp = array_shift($m);
    
$flag1 = $tmp{0};
    
$flag2 = substr($tmp, -1);
    
$tmp = preg_replace('#[^A-Za-zА-Яа-я0-0]#i', '', $tmp);
    if (
$flag1=='!') $out[] = '( '.$name.'=\''.$tmp.'\' OR '.$name.' Like \''.$tmp.' %\'  OR '.$name.' Like \'% '.$tmp.'\')';
    else
$out[] = '( '.$name.' Like \'%'.$tmp.'%\')';
}
return
implode(' AND ', $out);
}
function  
pre($in) {
    echo
'<pre>';
        
print_r($in);
    echo
'</pre>';
}
?>


после в оригинальную функци поиска вставляю изменения, получается следующее:

PHP - Код
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
<?php
function search2_q() {
global
$prefix, $db, $module_name, $rus, $eng, $pagetitle, $defis;
$pagetitle = "$defis "._MUSIC_LOGO." $defis "._search2."";
head();
menu();
    
OpenTable();
    if (
$rus!=''){
    
$lang='performer';
    
$letter=$rus;
    }else if(
$eng !=''){
    
$lang='performer';
    
$letter=$eng;
    }
    
$result = $db->sql_query("SELECT lid, cid, performer, title, filesize, filetype, hits, votes, totalvotes FROM ".$prefix."_music WHERE status != '0' AND $lang Like '$letter%' ORDER BY lid");
    
$nrows = $db->sql_numrows($result);
    
$lid = intval($lid);
    
$cid = intval(trim($cid));
    
$x=0;
    
$the_query = stripslashes($query);
    
$the_query = str_replace("\'", "'", $the_query);
    if (
$nrows>0) {
    
$a = 1;
    echo
"<center><b>"._search2." ($letter):</b></center>" ;
   echo
"<table  border=\"0\" cellspacing=\"1\" cellpadding=\"3\" class=\"bgcolor4\"><tr><th width=\"100\">"._P_MNAME."</th><th width=\"10%\">"._SIZE."</th><th width=\"2%\">"._FORM."</th><th width=\"10%\">"._REITING."</th><th width=\"5%\">"._HITS."</th></tr>";

     while(list(
$lid, $cid, $performer, $title, $filesize, $filetype, $hits, $votes, $totalvotes) = $db->sql_fetchrow($result)) {
    echo
"<tr><td  class=\"bgcolor1\"><li>$a: <a href=index.php?name=$module_name&op=search2_q&rus=$performer>$performer</a><a href=index.php?name=Music&op=view_music&lid=$lid> - $title</a></li></a></td>
    <td  class=\"bgcolor1\"><div align=\"center\"><small>"
.files_size($filesize)."</small></div></a></td>
    <td  class=\"bgcolor1\"><div align=\"center\">"
.mimetype("$filetype")."</div></a></td>
    <td  class=\"bgcolor1\"><div align=\"center\">"
.reiting($votes, $totalvotes)."</div></td>
    <td  class=\"bgcolor1\"><div align=\"center\">
$hits</div></td>";
    
$a++;
    }
     echo
"";
    } else {
    echo
"
    }

echo"
</td></tr></table>";
CloseTable();
foot();
}
?>


после этого все должно работать ?

не происходит поиска, пишет , что ничего не найдено.

чтобы стало понятней, я дам прямую ссылку туда, где это все происходит

PHP - Код
1
2
3
<?php
http
://www.novmuz.net/index.php?name=Music&op=view_music&lid=259
?>


по этой ссылке откроется страница модуля Music с исполнителем matt toyman. Если навести курсор мышы на него, то внизу в строке состояния броузера, ну или в командной строке после выполнения, вы увидите что ищется только слово matt, а не matt Toyman как хотелось бы. Вот.
decide Дата: 07.08.2009, в 21:10 | Сообщение №10
decide
Пользователь
Пользователь №: 471
Сообщений: 30

и еще, готов поделиться бабосами за доработку этого модуля, а именно:
Сделать работу с исполнителем (т.е. нажимаешь на исполнителя а там фото и биография.)
При добавлении песни разделить на альбом и непосредственно композицию, с еще какими то либо признаками. Т.е. чтобы пользователь мог бы и так и сяк заюзать данный модуль.

Еще высказывались идеи о создании для пользователя плай листа, сам не видел как это работает, но думаю примеры есть. Вот.

Готов заплатить за это разумные WMR.
Serg_pnz Дата: 08.08.2009, в 08:26 | Сообщение №11
Serg_pnz
Администратор
Пользователь №: 1
Сообщений: 2242

В упор не вижу где-это в function search2_q() внесены изменения.

Не все кальсоны с оторванными пуговицами - брюки. © Serg_pnz
"...даме водки? Это чистый спирт!" © кот Бегемот
SHAKA1 Дата: 08.08.2009, в 11:31 | Сообщение №12
SHAKA1
Участник
Пользователь №: 323
Сообщений: 77

Цитата
Внимание вопрос, как сделать, чтобы учитывались все слова названия при поиске


Цитата
Если навести курсор мышы на него, то внизу в строке состояния броузера, ну или в командной строке после выполнения, вы увидите что ищется только слово matt, а не matt Toyman как хотелось бы.


Проблема в незнании html, а не php:

Нужно писать не:
Код
1
<a href=index.php?name=$module_name&op=search2_q&rus=$performer>$performer</a>

а так:
Код
1
<a href='index.php?name=$module_name&op=search2_q&rus=$performer'>$performer</a>


Цитата

Правила верстки:
24. Значение атрибутов тегов должны быть заключены в кавычки


_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
Отредактированно SHAKA1 08.08.2009 г. в 11:35:05
decide Дата: 08.08.2009, в 13:14 | Сообщение №13
decide
Пользователь
Пользователь №: 471
Сообщений: 30

SHAKA1, помогло.
Serg_pnz Дата: 08.08.2009, в 14:23 | Сообщение №14
Serg_pnz
Администратор
Пользователь №: 1
Сообщений: 2242

ёёёё.... а я там функции поиска по части слова пишу, да что бы слова в любом порядке шли. м-дя...

Не все кальсоны с оторванными пуговицами - брюки. © Serg_pnz
"...даме водки? Это чистый спирт!" © кот Бегемот

Вы не можете ответить в тему анонимно, пожалуйста, войдите или зарегистрируйтесь!


Реклама
Главная | Форум | Новости | Подписка на новости | Темы новостей | Добавить новость | Каталог файлов | Карта файлового архива | Публикации | Опросы | Анкета пользователя | Чат | BestMaker | Викторина | Архив новостей | Карманный оракул | Поиск по сайту с помощью Яндекс | Поиск по сайту с помощью Google | Фото дня | Для души | Погода на 3 дня | IndexCat | IndexTop | Map_Pages | Весь Оракул

Rambler's Top100

Генерация страницы: 0.275 сек. и 17 запросов к базе данных за 0.027 сек.
Web site engine code is Copyright © 2006 by SLAED CMS. All rights reserved.