Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Mysql Search, Класс для поиска.... 
:(
    Опции темы
AntonioBanderaz
Дата 26.8.2005, 13:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Velichko Anton
**


Профиль
Группа: Участник
Сообщений: 851
Регистрация: 28.4.2005
Где: Санкт-Петербург

Репутация: 1
Всего: 18



У мя вроде через Ж написано, может кто что посоветует?
Код

<?php
/*
Class MysqlSearch
Anton Velichko 25.08.2005 
*/
class MysqlSearch {
    var $host = ''; //Сервер подключения Mysql
    var $user = 'root'; //Пользователь
    var $password = ''; //Пароль
    var $database = ''; //База данных
    
    var $__activeLink = '';
    var $__connectKey = '';
    var $__searchMass = array();
    
    var $where = array(); //Массив типа таблица=>row
    var $what = ''; //Строка поиска

    var $resultMass = array();
    
    
    
    function MysqlSearch($host = '',$user = '',$password = '',$database = '') {
            $this->host = $host;
            $this->user = $user;
            $this->password = $password;
            $this->database = $database;
            
            $this->__connectKey = mysql_pconnect($this->host,$this->user,$this->password);    
            mysql_select_db($this->database,$this->__connectKey);
    }
    
    function newSearch($what,$where) {
        if(is_array($where) && isset($what)) {    
            $this->what = $what;
            $this->where = $where;
            $this->splitWhat();
            $this->createQuery();
        }    
    }
    
    function getResults() {
        return $this->resultMass;
    }
    
    function createQuery() {
        foreach($this->where as $key => $value) {
            $query = "select * from $key where ";
            for($i=0;$i<count($this->__searchMass);$i++) {
                $query.='( '.$value." rlike '".$this->__searchMass[$i]."' ) or ";
            }
            $query = substr($query,0,strlen($query)-4);
            //echo $query;
            $this->__activeLink = mysql_query($query,$this->__connectKey);
            while($row = mysql_fetch_assoc($this->__activeLink)) array_push($this->resultMass,$row);
        }
            
    }
    
    function splitWhat() {
        $separators = " ,.!?-";
        $wordArray = array();
        $total = 0;
        for($token = strtok($this->what,$separators);$token !== false;$token = strtok($separators)) {
            if($token != "" ) {
                if(!isset($word_count[strtolower($token)])) {
                     $word_count[strtolower($token)] = 1;
                     array_push($wordArray,strtolower($token));
                }
                else $word_count[strtolower($token)]++;
                $total++;
            }    
        }
        for($i=0;$i<count($wordArray);$i++) {
            $this->createResultMass($i,count($wordArray),$wordArray);
        }
    }
    
    function createResultMass($start,$end,$mass) {
        if($end > $start) {
            $val = '';
            for($i=$start;$i<$end;$i++) $val .= ' '.$mass[$i];    
            array_push($this->__searchMass,$val);
            $this->createResultMass($start,$end-1,$mass);
        }
            
    }
}

/* Пример использования 
$search = new MysqlSearch('host','user','password','db');
$search->newSearch('search string',array("table"=>"key"));
print_r($search->getResults());
*/

?>



--------------------
ГЫ... 
PM MAIL ICQ   Вверх
MuToGeN
Дата 26.8.2005, 14:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лесник
****


Профиль
Группа: Модератор
Сообщений: 4379
Регистрация: 15.8.2002
Где: Москва

Репутация: 4
Всего: 32



можно еще ORDER BY MATCH ... AGAINST ... добавить


--------------------
Three pings for the token rings,
Five pings for the UNIX machines,
Hundred pings for the broken links,
One special ping to check them all
Through Simple Network Management Protocol!
PM MAIL ICQ   Вверх
AntonioBanderaz
  Дата 27.8.2005, 01:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Velichko Anton
**


Профиль
Группа: Участник
Сообщений: 851
Регистрация: 28.4.2005
Где: Санкт-Петербург

Репутация: 1
Всего: 18



Первое: это будет работать только для 'полного текста' (FULLTEXT)
Второе: если будет много совподений, то выводится - ничего

И третье:

select id,text1,match(text1) against('искаться') as sovp from text order by sovp - типо запрос

Array ( [0] => Array ( [id] => 1 [text1] => Типо здесь текст который по идее должен искаться.... [sovp] => 0 ) [1] => Array ( [id] => 2 [text1] => Типо здесь текст который по идее должен [sovp] => 0 ) [2] => Array ( [id] => 3 [text1] => Типо здесь текст который по идее [sovp] => 0 ) [3] => Array ( [id] => 4 [text1] => Типо здесь текст который по идее должен искаться... [sovp] => 0 ) ) - типо ответ...

select * from text where ( text1 rlike ' типо здесь текст который по идее должен искаться' ) or ( text1 rlike ' типо здесь текст который по идее должен' ) or ( text1 rlike ' типо здесь текст который по идее' ) or ( text1 rlike ' типо здесь текст который по' ) or ( text1 rlike ' типо здесь текст который' ) or ( text1 rlike ' типо здесь текст' ) or ( text1 rlike ' типо здесь' ) or ( text1 rlike ' типо' ) or ( text1 rlike ' здесь текст который по идее должен искаться' ) or ( text1 rlike ' здесь текст который по идее должен' ) or ( text1 rlike ' здесь текст который по идее' ) or ( text1 rlike ' здесь текст который по' ) or ( text1 rlike ' здесь текст который' ) or ( text1 rlike ' здесь текст' ) or ( text1 rlike ' здесь' ) or ( text1 rlike ' текст который по идее должен искаться' ) or ( text1 rlike ' текст который по идее должен' ) or ( text1 rlike ' текст который по идее' ) or ( text1 rlike ' текст который по' ) or ( text1 rlike ' текст который' ) or ( text1 rlike ' текст' ) or ( text1 rlike ' который по идее должен искаться' ) or ( text1 rlike ' который по идее должен' ) or ( text1 rlike ' который по идее' ) or ( text1 rlike ' который по' ) or ( text1 rlike ' который' ) or ( text1 rlike ' по идее должен искаться' ) or ( text1 rlike ' по идее должен' ) or ( text1 rlike ' по идее' ) or ( text1 rlike ' по' ) or ( text1 rlike ' идее должен искаться' ) or ( text1 rlike ' идее должен' ) or ( text1 rlike ' идее' ) or ( text1 rlike ' должен искаться' ) or ( text1 rlike ' должен' ) or ( text1 rlike ' искаться' )

Array ( [0] => Array ( [id] => 1 [text1] => Типо здесь текст который по идее должен искаться.... [text2] => Типо здесь текст который по идее должен искаться.... ) [1] => Array ( [id] => 2 [text1] => Типо здесь текст который по идее должен [text2] => Типо здесь текст который по идее должен искаться.... ) [2] => Array ( [id] => 3 [text1] => Типо здесь текст который по идее [text2] => 33333 ) [3] => Array ( [id] => 4 [text1] => Типо здесь текст который по идее должен искаться... [text2] => 121 ) )

smile smile smile smile smile smile Может попробуешь объяснить сей факт....

Хотя действительно удобней и есть возможность упорядывачивать по совподению....


--------------------
ГЫ... 
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса

Внимание: данный раздел предназначен для решения сложных, нестандартных задач.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Для профи | Следующая тема »


 




[ Время генерации скрипта: 0.0769 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.