row = null; $v = &$this->command; $this->sqlresult = calculer_select($v['select'], $v['from'], $v['type'], $v['where'], $v['join'], $v['groupby'], $v['orderby'], $v['limit'], $v['having'], $v['table'], $v['id'], $v['connect'], $this->info); $this->err = !$this->sqlresult; $this->firstseek = false; $this->pos = -1; // pas d'init a priori, le calcul ne sera fait qu'en cas de besoin (provoque une double requete souvent inutile en sqlite) //$this->total = $this->count(); } /* * array command: les commandes d'initialisation * array info: les infos sur le squelette */ public function __construct($command, $info = array()) { $this->type = 'SQL'; $this->command = $command; $this->info = $info; $this->select(); } /** * Rembobiner * * @return bool */ public function rewind() { return ($this->pos > 0) ? $this->seek(0) : true; } /** * Verifier l'etat de l'iterateur * * @return bool */ public function valid() { if ($this->err) { return false; } if (!$this->firstseek) { $this->next(); } return is_array($this->row); } /** * Valeurs sur la position courante * * @return array */ public function current() { return $this->row; } public function key() { return $this->pos; } /** * Sauter a une position absolue * * @param int $n * @param null|string $continue * @return bool */ public function seek($n = 0, $continue = null) { if (!sql_seek($this->sqlresult, $n, $this->command['connect'], $continue)) { // SQLite ne sait pas seek(), il faut relancer la query // si la position courante est apres la position visee // il faut relancer la requete if ($this->pos > $n) { $this->free(); $this->select(); $this->valid(); } // et utiliser la methode par defaut pour se deplacer au bon endroit // (sera fait en cas d'echec de cette fonction) return false; } $this->row = sql_fetch($this->sqlresult, $this->command['connect']); $this->pos = min($n, $this->count()); return true; } /** * Avancer d'un cran * * @return void */ public function next() { $this->row = sql_fetch($this->sqlresult, $this->command['connect']); $this->pos++; $this->firstseek |= true; } /** * Avancer et retourner les donnees pour le nouvel element * * @return array|bool|null */ public function fetch() { if ($this->valid()) { $r = $this->current(); $this->next(); } else { $r = false; } return $r; } /** * liberer les ressources * * @return bool */ public function free() { if (!$this->sqlresult) { return true; } $a = sql_free($this->sqlresult, $this->command['connect']); $this->sqlresult = null; return $a; } /** * Compter le nombre de resultats * * @return int */ public function count() { if (is_null($this->total)) { if (!$this->sqlresult) { $this->total = 0; } else { # cas count(*) if (in_array('count(*)', $this->command['select'])) { $this->valid(); $s = $this->current(); $this->total = $s['count(*)']; } else { $this->total = sql_count($this->sqlresult, $this->command['connect']); } } } return $this->total; } }