Hellihello
public function rewind()
{
$this->row = mysqli_data_seek($this->query, 0);
return $this->row;
}
offenbar wird die Funktion rewind() vor der ersten Iteration durch ein foreach ausgeführt. Dort aber wird $this->row das Ergebnis der der Funktion mysqli\_data\_seek zugewiesen. Diese hat den den result-pointer zurückgesetzt, gibt aber im Erfolgsfalle true zurück - was oben fälschlicherweise der Klassenvariable $row zugewiesen wird.
Ich habe deshalb jetzt:
~~~php
class Robs_MysqlIterator implements Iterator
{
protected $row = NULL;
protected $resource = NULL;
protected $key = 0;
private function __construct($resource)
{
$this->resource = $resource;
}
public function init($resource)
{
if (get_class($resource) === "mysqli_result") {
$instance = new Robs_MysqlIterator($resource);
return $instance;
} else {
return false;
}
}
public function key() {
return $this->key++;
}
public function current()
{
if($this->row != null) {
return $this->row;
}
}
public function next()
{
$this->row = mysqli_fetch_assoc($this->resource);
return $this->row;
}
public function rewind()
{
mysqli_data_seek($this->resource, 0);
$this->row = mysqli_fetch_assoc($this->resource);
return $this->row;
}
public function valid()
{
if($this->row == false) {
return false;
}
return true;
}
}
Für die public static function init suchte ich nach einem Pattern. Factory und Singleton sind es wohl nicht. Ich wollte die Überprüfung der resource (Parametervalidierung) nicht dem Konstruktor überlassen, was vielleicht auch Blödsinn ist. Immerhin konnte ich mit "new Klassenname" aber kein $this erzeugen, das war im var_dump dann NULL. Ob $instance = new Klassenname() hier besser zu machen geht?
Dank und Gruß,