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

Soyez le premier à donner votre avis sur cette source.

Vue 4 513 fois - Téléchargée 251 fois

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

Ajouter un commentaire

Commentaires

malalam
Messages postés
10844
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
17 -
Merci Guill,

pour prado, je viens de mater un peu quelques bouts de code : très intéressant, très bien codé, à la pointe de la technologie PHP5 :-) J'aime beaucoup! Et ça donne des idées!
Merci pour le lien!
guill76
Messages postés
193
Date d'inscription
mercredi 24 août 2005
Statut
Membre
Dernière intervention
3 juin 2016
-
Salut Malalam,
En tout cas, merci pour tes contributions, j'ai, depuis tes dernières sources, compris encore plus de choses sur les itérateurs mais aussi sur les classes abstraites et interfaces, qui amorcent la notion de framework.
Je suis même en train de décortiquer le framework prado qui peut donner encore un plus large évantail de la poo en php.
http://www.pradosoft.com/
c'est biensûr évidement pas de la pub, mais juste que si ça peut éveiller la curiosité, tant mieux.
see you soon.
malalam
Messages postés
10844
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
17 -
Juki => le but n'était pas de perdre les gens, mais de leur montrer, doucement, des exemples concrets d'utilisation des différentes classes composant la SPL...
DBO, c'est autre chose. Vu les 2 fonctions dont j'ai besoin côté sql...c'est inutile. D'autant plus que peu de monde l'utilise, et que donc, son utilisation aurait demandé bcp trop d'adaptation de la part des utilisateurs. Alors que là...tout reste très simple et compréhensible. Et ce, sans rajouter une couche d'abstraction supplémentaire pour 2 fonctions. Mais dans le cadre d'une classe générique d'abstraction de bdd...ok :-)
juki_webmaster
Messages postés
947
Date d'inscription
mercredi 19 novembre 2003
Statut
Membre
Dernière intervention
5 avril 2008
3 -
Je suis deçu que tu ait pas utilisé la PDO :(
malalam
Messages postés
10844
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
17 -
Ah, cette mise en cache un peu longuette... ;-) T'avais répondu avant moi, mais je n'avais pas vu ton message, désolé.

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.