[php5] limit package - limitation generique d'un jeu de resultat - les iterateurs en php

Description

Bon, encore des itérateurs ;-)

Ceci est un package tout simple, tout petit, permettant de renvoyer un jeu de résultat limité.
En clair, une requête, un tableau, vous n'en voulez qu'une partie ? ben voilà.
Ca rappelle le LIMIT de mysql évidemment.
Mais c'est plus pratique à mon sens.
Le fichier limit.php montre deux exemples d'utilisation simples.
Vous devez vous créer une base...
Nom : dbname
Table : table
champs : id

Ca suffit :-)

Ou adaptez à vos besoins, c'est très simple.
DB implémentées : mysql et mssql.
Et les tableaux...

Pratique pour faire une petite pagination facilement.

Source / Exemple :


<?php
/**

  • class oLimit implements Iterator
  • @author johan <johan.barbier@gmail.com>
  • @version 20061205
  • /
abstract class oLimit implements Iterator { /**
  • Number of items to retrieve
*
  • @var integer
  • /
protected $iCount; /**
  • Starting offset
*
  • @var integer
  • /
protected $iOffset; /**
  • Total number of items for the request
*
  • @var unknown_type
  • /
protected $iMax; /**
  • Current internal position
  • @var integer
  • /
protected $iPos = 0; /**
  • Exception messages
*
  • /
const ERROR_COUNT_EMPTY = 'iCount cannot be equal to 0'; const ERROR_NO_INTEGER = 'iCount and iOffset parameters must be integer'; const ERROR_NEGATIVE = 'iOffset cannot be negative'; /**
  • Constructor
  • set some parameters
*
  • @param integer $iOffset
  • @param integer $iCount
  • /
protected function __construct ($iOffset = 0, $iCount = -1) { if (!is_int ($iOffset) || !is_int ($iCount)) { throw new Exception (self::ERROR_NO_INTEGER); } if ($iOffset < 0) { throw new Exception (self::ERROR_NEGATIVE); } if ($iCount === 0) { throw new Exception (self::ERROR_COUNT_EMPTY); } $this -> iOffset = $iOffset; $this -> iCount = $iCount; $this -> iMax = $this -> countMax (); } /**
  • Iterator method
  • Moves the internal cursor to the next position
*
  • /
public function next () { $this -> iPos ++; } /**
  • Iterator method
  • Checks the validity of the current position
  • If iCount === -1, then we go up to the end of the request (total number of items iMax)
  • If not, we check if the current position iPos is equal or greater than the number of items to retrieve (iCount)
*
  • @return boolean
  • /
public function valid () { if (($this -> iOffset + $this -> iPos) > $this -> iMax) { return false; } if ($this -> iCount > -1 && $this -> iPos >= $this -> iCount) { return false; } return true; } /**
  • Returns the current internal position
*
  • @return integer
  • /
public function getInternalPos () { return $this -> iPos; } /**
  • Returns the current request position
*
  • @return integer
  • /
public function getExternalPos () { return $this -> iPos + $this -> iOffset; } /**
  • Returns the total number of items in the request
*
  • @return integer
  • /
public function getExternalCount () { return $this -> iMax + 1; } abstract protected function countMax (); } /**
  • class mysqlLimit extends oLimit
  • @author johan <johan.barbier@gmail.com>
  • @version 20061205
  • /
class mysqlLimit extends oLimit { /**
  • request resource
*
  • @var mysql result resource (comes from mysql_query)
  • /
private $rRes; /**
  • Exception messages
*
  • /
const ERROR_NO_RESOURCE = 'rRes must be a valid mysql resource'; /**
  • Constructor
  • Sets some parameters, and set the current position via data_seek
*
  • @param mysql result resource $rRes
  • @param integer $iOffset
  • @param integer $iCount
  • /
public function __construct ($rRes, $iOffset = 0, $iCount = -1) { if (!is_resource ($rRes) || 'mysql result' !== get_resource_type ($rRes)) { throw new Exception (self::ERROR_NO_RESOURCE); } $this -> rRes = $rRes; parent::__construct ($iOffset, $iCount); mysql_data_seek ($this -> rRes, $this -> iOffset + $this -> iPos); } /**
  • Returns the current result array at the current position
*
  • @return array
  • /
public function current () { return mysql_fetch_assoc ($this -> rRes); } /**
  • Checks validity of the current position
*
  • @return boolean
  • /
public function valid () { return parent::valid (); } /**
  • Reset the resource result to the starting offset
*
  • /
public function rewind () { mysql_data_seek ($this -> rRes, $this -> iOffset); } /**
  • Do not know what do return here
*
  • @return void
  • /
public function key () { return false; //return mysql_fetch_assoc ($this -> rRes); } /**
  • Returns the total number of items of the query
*
  • @return integer
  • /
protected function countMax () { return mysql_num_rows ($this -> rRes) - 1; } } /**
  • class mssqlLimit extends oLimit
  • see mysqlLimit for documentation
  • @author johan <johan.barbier@gmail.com>
  • @version 20061205
  • /
class mssqlLimit extends oLimit { private $rRes; const ERROR_NO_RESOURCE = 'rRes must be a valid mssql resource'; public function __construct ($rRes, $iOffset = 0, $iCount = -1) { if (!is_int ($rRes) && (!is_resource ($rRes) || 'mssql result' !== get_resource_type ($rRes))) { throw new Exception (self::ERROR_NO_RESOURCE); } $this -> rRes = $rRes; parent::__construct ($iOffset, $iCount); mssql_data_seek ($this -> rRes, $this -> iOffset + $this -> iPos); } public function current () { return mssql_fetch_assoc($this -> rRes); } public function valid () { return parent::valid (); } public function rewind () { mssql_data_seek ($this -> rRes, $this -> iOffset); } public function key () { return false; //return mssql_fetch_assoc ($this -> rRes); } protected function countMax () { return mssql_num_rows ($this -> rRes) - 1; } } /**
  • class arrayLimit extends LimitIterator
  • @author johan <johan.barbier@gmail.com>
  • @version 20061205
  • /
class arrayLimit extends LimitIterator { /**
  • Exception messages
*
  • /
const ERROR_NO_ARRAY = 'aRes must be an array'; /**
  • Constructor
  • Sets some parameters and get LimitIterator constructor
*
  • @param array $aRes
  • @param integer $iOffset
  • @param integer $iCount
  • /
public function __construct ($aRes, $iOffset = 0, $iCount = -1) { if (!is_array ($aRes)) { throw new Exception (self::ERROR_NO_ARRAY); } $aIt = new ArrayIterator ($aRes); parent::__construct ($aIt, $iOffset, $iCount); $this -> rewind (); } } /**
  • class LimitFactory
  • factory for the oLimit package (optional)
  • @author johan <johan.barbier@gmail.com>
  • @version 20061205
  • /
class LimitFactory { /**
  • Array of implemented oLimit classes
*
  • @var array
  • /
private static $aTypes = array ( 'MYSQL' => 'mysqlLimit', 'MSSQL' => 'mssqlLimit', 'ARRAY' => 'arrayLimit' ); /**
  • Exception messages
*
  • /
const ERROR_NO_VALID_TYPE = '{__TYPE__} is not a valid type'; const ERROR_CLASS_NOT_FOUND = 'class {__CLASS__} has not been found'; /**
  • Factory : get the correct object given an implemented oLimit class
*
  • @param string $sType
  • @param mixed $mRes
  • @param integer $iOffset
  • @param integer $iCount
  • @return object
  • /
public static function factory ($sType, $mRes, $iOffset = 0, $iCount = -1) { if (!array_key_exists ($sType, self::$aTypes)) { throw new Exception (str_replace ('{__TYPE__}', $sType, self::ERROR_NO_VALID_TYPE)); } if (!class_exists (self::$aTypes[$sType])) { throw new Exception (str_replace ('{__CLASS__}', self::$aTypes[$sType], self::ERROR_CLASS_NOT_FOUND)); } return new self::$aTypes[$sType] ($mRes, $iOffset, $iCount); } } ?>

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.