Форум -> Обо всём... -> Поиск по всему словосочетанию и не по 1 слову | Поиск по всему словосочетанию и не по 1 слову |
---|
decide | Дата: 06.08.2009, в 22:36 | Сообщение №1 | ПользовательПользователь №: 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 | АдминистраторПользователь №: 1 Сообщений: 2242
| Например такая логика: бить на массив по пробелу и составлять из этого условие на запрос. | Не все кальсоны с оторванными пуговицами - брюки. © Serg_pnz
"...даме водки? Это чистый спирт!" © кот Бегемот |
| | decide | Дата: 07.08.2009, в 09:31 | Сообщение №3 | ПользовательПользователь №: 471 Сообщений: 30
| Тезка, к полному моему сожалению в пхп = я полный 1 (по 10 бальной системе). Могу лишь смутно догадываться для чего какая функция :(
Ты не мог бы привести пример решения, если не сложно. |
| | Serg_pnz | Дата: 07.08.2009, в 10:19 | Сообщение №4 | АдминистраторПользователь №: 1 Сообщений: 2242
| Всё зависит от хотелок.
Можно сделать поиск по полным словам и по фрагментам заключенным/начинающимся/заканчивающимся на звёздочку.
Постараюсь в течении дня написать универсальную функцию. | Не все кальсоны с оторванными пуговицами - брюки. © Serg_pnz
"...даме водки? Это чистый спирт!" © кот Бегемот |
| | decide | Дата: 07.08.2009, в 10:43 | Сообщение №5 | ПользовательПользователь №: 471 Сообщений: 30
| я буду тебе весьма и весьма признателен |
| | Serg_pnz | Дата: 07.08.2009, в 12:35 | Сообщение №6 | АдминистраторПользователь №: 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 | ПользовательПользователь №: 471 Сообщений: 30
| СПасибо Serg_pnz тебе за труды, но однако воспользоваться к сожалению не могу, думалки не хватает.
Скажи так, тот поиск который приведен мной выше модернизации не подлежит, для получения нужного результата ? |
| | Serg_pnz | Дата: 07.08.2009, в 15:12 | Сообщение №8 | АдминистраторПользователь №: 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 | ПользовательПользователь №: 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 | ПользовательПользователь №: 471 Сообщений: 30
| и еще, готов поделиться бабосами за доработку этого модуля, а именно:
Сделать работу с исполнителем (т.е. нажимаешь на исполнителя а там фото и биография.)
При добавлении песни разделить на альбом и непосредственно композицию, с еще какими то либо признаками. Т.е. чтобы пользователь мог бы и так и сяк заюзать данный модуль.
Еще высказывались идеи о создании для пользователя плай листа, сам не видел как это работает, но думаю примеры есть. Вот.
Готов заплатить за это разумные WMR. |
| | Serg_pnz | Дата: 08.08.2009, в 08:26 | Сообщение №11 | АдминистраторПользователь №: 1 Сообщений: 2242
| В упор не вижу где-это в function search2_q() внесены изменения. | Не все кальсоны с оторванными пуговицами - брюки. © Serg_pnz
"...даме водки? Это чистый спирт!" © кот Бегемот |
| | SHAKA1 | Дата: 08.08.2009, в 11:31 | Сообщение №12 | УчастникПользователь №: 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 | ПользовательПользователь №: 471 Сообщений: 30
| | | Serg_pnz | Дата: 08.08.2009, в 14:23 | Сообщение №14 | АдминистраторПользователь №: 1 Сообщений: 2242
| ёёёё.... а я там функции поиска по части слова пишу, да что бы слова в любом порядке шли. м-дя... | Не все кальсоны с оторванными пуговицами - брюки. © Serg_pnz
"...даме водки? Это чистый спирт!" © кот Бегемот |
| | | Вы не можете ответить в тему анонимно, пожалуйста, войдите или зарегистрируйтесь!
|
|