Iterator-Klasse für mysql gibt erste Zeile doppelt aus

ZodiacXP

Erfahrenes Mitglied
Auch wenn die folgende Klasse einzeln gesehen wenig sinn macht, ist sie im gesamten System unabdingbar. Deswegen ist der folgende Fehler umso ärgerlicher:
Die erste Zeile eines mysql-Results wird doppelt ausgegeben.

Ablauf: rewind(), current(), next(), current(), next(), ...
Vermutungen:
  • rewind() setzt falsch zurück [denkbar],
  • next() zählt nicht ordentlich hoch [undenkbar],
  • current() wählt durch die Kontrollstrukturen die erste Zeile zwei mal [bestimmt]
  • Wenn die erste Zeile doppelt ist, könnte evtl auch die letzte fehlen.

Aber je öfter ich meine Vermutung prüfe umso valider sehe ich das ganze. Hoffe ihr seht unvoreingenommen sofort den Fehler:

PHP:
abstract class Db_Statement {
	
	protected $_line = 0;
	private $_result = NULL;
	private $_current = array();
}

class Db_Statement_mysql extends Db_Statement implements Iterator {
	
	public function current ()
	{
		if ($this->_current === NULL)
		{
			$this->_current = mysql_fetch_assoc($this->_result);
		}
		return $this->_current;
	}

	public function next ()
	{
		$this->_line++;
		$this->_current = NULL;
	}

	public function key ()
	{
		return $this->_line;
	}

	public function valid ()
	{
		return ($this->_line <= $this->_valid);
	}

	public function rewind ()
	{
		if ($this->_line != 1)
		{
			mysql_data_seek($this->_result, 0);		// goto first line
			$this->_line = 1;						// reset counter
		}
		$this->_current = mysql_fetch_assoc($this->_result);
	}
	
	function __construct($result) {
		if ($result === false)
		{
			echo mysql_error();
		}
		
		$this->_result = $result;
		
		$this->_current = NULL;
		$this->_valid = mysql_num_rows($this->_result);
	}
}
 
Zuletzt bearbeitet:
Bei meinem Versuch funktioniert next() absolut nicht. Er zählt nur weiter. bei current() prüft er auf NULL, ansonsten gibt er wieder denselben aus. Er geht aber nirgens zum nächsten Datensatz

Nachtrag:
Wenn man next() so wereitert, geht es bei mir richtig
PHP:
    public function next (){
        $this->_line++;
        $this->_current = mysql_fetch_assoc($this->_result);
    }
 
Zuletzt bearbeitet:
Jo hab eine Zeile bei next() unterschlagen - ist nun oben zu lesen.

Ich hab viel zu kompliziert gedacht mit meinen Strukturen. Dachte immer mysql_fetch_assoc würd ein Fehler schmeißen, wenn er zum Schluss ins leere greift. Aber das gibt ja nur ein FALSE zurück.

Danke dein Hinweis hat einiges gebracht. Der Fehler besteht zwar noch aber das muss nun an dem liegen was im foreach ist. (zu viel um es hier zu posten - mach mich selbst dran)
 
Zurück