Търсачка със странициране
Малко обяснение за търсачката.
Как работи?
Създава един 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 на таблици. не съм го тествал затова няма да го описвам. Демо няма как да ви покажа в мемента.
Кода е авторски. Ползвайте го със здраве :)






/ Трябва да сте регистриран за да напишете коментар /
От: Pavkatar
13:45 07-11-2009
Дава грешка тук 'username'=>$_POST['username']
От: admin
14:54 07-11-2009
Махни коментарите от кода.
Много често те са проблема.
1