Ofte skal man sortere et MySQL-udtræk på flere forskellige måder for at gøre dette nemmere har jeg udviklet klassen sqlSort.<?php
/*
EXAMPLE:
$sort = new sqlSort(array('id','name'),'id','order','dir','DESC');
$sql = "SELECT * FROM names where 1 ".$sort->sql();
$result = mysql_query($sql);
if(mysql_num_rows($result))
{
echo 'Sort: '.$sort->link('id','by id').' | '.$sort->link('name','by name').'<br>';
while($row = mysql_fetch_array($result))
{
echo $row['id'].': '.$row['name'].'<br>';
}
}
*/
class sqlSort
{
var $root;
var $startDir;
var $dirVar;
var $orderVar;
var $currentDir;
var $currentOrder;
var $sorts;
var $subjects;
function sqlSort(
$subjects=array('id'),
$defaultOrder='id',
$orderVar='order',
$dirVar='dir',
$startDir='DESC')
{
$a = explode('?',$_SERVER['REQUEST_URI']);
$this->root = 'http://'.$_SERVER["HTTP_HOST"].$a[0];
$this->subjects = array();
foreach($subjects as $k => $v)
{
$this->subjects[$v]=$v;
}
$this->orderVar = $orderVar;
$this->sorts = $sorts;
$this->dirVar = $dirVar;
$this->startDir = $this->keep($startDir);
//Finds the current direction
$this->currentDir = $this->keep($_GET[$dirVar]);
$this->currentOrder = $_GET[$orderVar]=='' ? $defaultOrder : $_GET[$orderVar];
if(!$this->subjects[$this->currentOrder])
{
$this->currentOrder = $defaultOrder;
}
}
function makePath($subject)
{
if($this->subjects[$subject])
{
$str = $this->root.'?';
foreach($_GET as $k => $v)
{
if($k==$this->dirVar || $k == $this->orderVar)
{
//do nothing!
}
else
{
$str .= $k.'='.urlencode($v).'&';;
}
}
if($subject==$this->currentOrder)
{
$dir = $this->swap($this->currentDir);
}
else
{
$dir = $this->startDir;
}
$str .= $this->dirVar.'='.$dir.'&'.$this->orderVar.'='.$subject;
return $str;
}
else
{
return '';
}
}
function link($subject,$text)
{
return '<a href="'.$this->makePath($subject).'">'.$text.'</a>';
}
function keep($var)
{
$var = strtoupper($var);
$var = $var == 'ASC'?'ASC':'DESC';
return $var;
}
function swap($var)
{
$var = strtoupper($var);
$var = $var == 'DESC'?'ASC':'DESC';
return $var;
}
function sql()
{
$sql = ' ORDER BY '.$this->currentOrder.' '.$this->currentDir.' ';
return $sql;
}
}
?>