Webmaster общности: Predpriemach.com | SearchEngines.bg

    Търсачка със странициране

    Автор: StalWart

    Малко обяснение за търсачката.
    Как работи?
    Създава един mysql result обръща го в arrayobject запазва обекта в сессия и и при страницирането не прави връзка към базата дани. Търсачката не е подходяща за много голяма база дани. тествана е до 3000 резултата при търсене няма проблем, ако искате повече увеличете си mysql cache.
    Ето го кода.

    class Search {
    
    public $query = 'SELECT {what} FROM {table} {join} WHERE {where}';
    public $pagestring;
    public $results;
    public $pages;
    public $onpage;
    function __construct($onpage)
    {
    ob_start();
    session_start();
    $this->onpage = $page;
    if($_SERVER['QUERY_STRING'] == null)
    {
    unset($_SESSION['result']);
    }
    }
    
    
    function get_query($array, $table, $select = "*", $join = null)
    {
    if($_POST)
    {
    unset($_SESSION['result']);
    if(is_array($array))
    {
    foreach ($array as $key=>$value)
    {
    $like[] = $key.' LIKE "%'.$value.'%"';
    }
    if(is_array($join))
    {
    $join = implode(" ", $join);
    }
    
    $old = array('{what}', '{table}', '{where}', '{join}');
    $new = array($select, $table, implode(' and ', $like), $join);
    //var_dump(str_replace($old, $new, $this->query));
    $query = mysql_query(str_replace($old, $new, $this->query));
    } elseif (is_string($array))
    {
    $query = mysql_query($array);
    } else {
    return self::get_results(null);
    }
    return self::get_results($query);
    } elseif($_SESSION['result'])
    {
    return $_SESSION['result'];
    } else {
    return self::get_results(null);
    }
    
    
    
    }
    
    private function get_results($query)
    {
    if(is_resource($query))
    {
    $arrobj = new ArrayObject();
    while ($row = mysql_fetch_object($query)) {
    $arrobj->append($row);
    }
    $_SESSION['result'] = $arrobj;
    $this->results = $arrobj->count();
    return $arrobj;
    }else {
    return new ArrayObject(array());
    }
    }
    
    function pagination($arrobj, $page, $rpp = 2, $deley = 5)
    {
    $pages = ceil($arrobj->count()/$rpp);
    $this->results = $arrobj->count();
    $this->pages = $pages;
    if($arrobj->count() == 0)
    {
    $s = new ArrayObject(array(null=>null));
    return $s->getIterator();
    
    } else {
    try {
    $arrint = $arrobj->getIterator();
    $return = new ArrayObject(array());
    for($arrint->seek($page*$rpp);
    $arrint->valid() and $arrint->key()<($page + 1)*$rpp;
    $arrint->next()
    )
    {
    $return->append($arrint->current());
    }
    }catch (Exception $e)
    {
    header('Location:'.$this->onpage);
    }
    self::createlinks($pages, $page, $deley);
    return $return->getIterator();
    }
    
    }
    
    function createlinks($pages, $cpage, $deley)
    {
    if($pages == 1)
    {
    $links[] = null;
    } else {
    if($cpage<$deley)
    {
    $links[] = "<a href='".$this->onpage."?page=0'>1</a>";
    }else{
    //First link
    $links[] = "<a href='".$this->onpage."?page=0'>First</a>";
    
    //Prev link
    if($cpage != 0)
    {
    $links[] = "<a href='".$this->onpage."?page=".($cpage-1)."'>«</a>";
    }
    }
    $start1 = $cpage - ($deley - 1);
    if($start1<2){$start = 2;} else {$start = $start1;}
    $stop = $start1 + ($deley*2);
    if($stop > $pages -1){
    $stop = $pages-1;
    }
    
    
    
    for ($p=$start;$p<=$stop; $p++)
    {
    $s = $p-1;
    if($s == $cpage){
    $links[] = "<a href='".$this->onpage."?page=".$s."'><b>".$p."</b></a>";
    } else {
    $links[] = "<a href='".$this->onpage."?page=".$s."'>".$p."</a>";
    }
    }
    
    if($pages>$cpage+$deley)
    {
    //Next link
    if($cpage != $pages -1)
    {
    $links[] = "<a href='".$this->onpage."?page=".($cpage+1)."'>»</a>";
    }
    //Last link
    $links[] = "<a href='".$this->onpage."?page=".($pages-1)."'>Last</a>";
    } else {
    $links[] = "<a href='".$this->onpage."?page=".($pages-1)."'>".($pages)."</a>";
    }
    $this->pagestring = implode('  ', $links);
    }
    }
    
    
    }

    запзвяате си го някаде този фаил и след това го инклудвате кадето ще го ползвате.
    Ето как се ползва.

    $e = new Search('test.php'); //страницата в която се намира търсачката и в която ще излизат резултатите
    $s = $e->get_query('username'=>$_POST['username'], 'table'); // Ще търсим в таблицата полето username, може да добавяте колкото си искате полета за търсене .
    $re = $e->pagination($s, $_GET['page'], 25,3); // $_GET['page'] e на която сте в момента, 25 е колко резултата на страница, 3 е колко страници да показва пред и след текущата страница.
    echo $e->results." Results found on ".$e->pages." pages<hr>"; // Показва коко резултата са намерени и колко страници
    for ($re->current(); $re->valid(); $re->next())
    {
    echo $re->current()->username."<br>"; // Показвате намерените резултати.
    
    }
    echo $e->pagestring; // Извеждаме линковете към страниците

    Ако се загледате малко в кода ще видите че има възможност за join на таблици. не съм го тествал затова няма да го описвам. Демо няма как да ви покажа в мемента.
    Кода е авторски. Ползвайте го със здраве 🙂

    Оставете коментар