Verständnis Frage - Alle Einträge per Klasse auslesen

Kalma

Erfahrenes Mitglied
Hi,

ich will ein User-Gästebuch schreiben, das folgende Datenbanktabellen Struktur hat:

gb_id
gb_owner_id
gb_author_id
gb_text
gb_date


Jetzt habe ich eine Klasse erstellt mit der ich gerne alle Einträge auslesen, validieren und anzeigen lassen würde.

Also folgendes:
PHP:
<?php
class GB
{
    construct() -> alle einträge auslesen und in array speichern
    author() -> informationen über autor auslesen
    text() -> text auslesen, mit bbcodes versehen etc
    date() -> datum auslesen und formatieren
}
?>

Und im Auslesen Teil dann folgendes:
PHP:
<?php
$gb = new GB();

foreach($gb as $select)
{
   echo 'Von '.$gb->author().' am '.$gb->date();
   echo $gb->text();
}
?>


Aber das geht ja nicht, da kommt er durcheinander mti den Einträgen aus dem Array.

Wie bekomme ich das hin?

Gruß
David
 
Du könntest noch eine Methode next() einfügen, welche dann angibt, dass der nächste Eintrag geladen werden soll. Dazu brauchst du auch noch eine klasseninterne Variable, nennen wir sie mal $i. Und dann brauchst du noch eine Methode, die dir sagt, ob noch Einträge da sind.

PHP:
<?php
class GB {
    private $i    = 0;
    private $data = array();
    private $max  = -1;

    public function __construct() {
        // Lade Einträge aus Datenbank in Array $data;
        $this->max = count($data) - 1;
    }

    public function author() {
        return $this->data[$this->i]['author'];
    }

    public function text() {
        return $this->data[$this->i]['text'];
    }

    public function date() {
        return $this->data[$this->i]['date'];
    }

    public function next() {
        $this->i++;
    }

    public function is() {
         return $this->i <= $this->max;
    }
}
?>

Wird dann so aufgerufen:
PHP:
<?php
$gb = new GB(); 

while($gb->is()) {
   echo 'Von '.$gb->author().' am '.$gb->date(); 
   echo $gb->text();
   $gb->next();
} 
?>
 
Zuletzt bearbeitet:
Danke für deine Antwort!


Könnte man diese Funktion automatisch aufrufen lassen? (next()).


Und die Einträge müsste ich doch folgendermaßen ins Array laden:
PHP:
while($select = mysql_fetch_assoc($result))
{
   $data[$i]['text'] = $select['text'];
   ...
   ....
}

richtig?
 
Ja, wenn ich es richtig betrachte, dann könntest du die Methode in der Methode is() aufrufen. Dann müsstest du aber auch die klasseninterne Variable $i = -1 setzen.

Die veränderte Methode is() sehe dann so aus:
PHP:
...
    public function is() {
        $this->next();
        return $this->i <= $this->max;
    }
...

Und dein Ansatz zum Laden der Datensätze in ein Array ist richtig.
 
PHP:
while($gb->is()) {

Was genau bedeutet das? Läuft er nur solange durch, wie is() true zurückgibt?
 
Hab es nun so gelöst:

PHP:
<?php
	class Wall extends Database {
		var $owner_id	= NULL;
		var $entries	= array();
		var $show		= 0;
		
		function __construct($owner)
		{	
			// id of walls' owner
			$this->owner_id	= $owner;
			
			
			// get all wall entries
			$query			=	'SELECT
									*
								FROM
									wall
								WHERE
									`wall_owner_id` = "'.parent::escape($this->owner_id).'"
								ORDER BY
									`wall_date` DESC';
			$result			=	parent::query($query);
			
			if($result == true) {
				$count			=	parent::count_elements($result);
				$this->counted	=	$count;
				
				
				if($count > 0) {				
					while($select = parent::fetch_array($result))
					{
						$this->entries[]	= $select;
					}

					return true;
				} else {
					// no entries
					return false;
				}
			} else {
				// query failed
				return false;
			}
			
			return false;
		}
		
		#-#############################################
		# desc: returns array with entries
		# param: 
		# return: (array) entries
		function output()
		{
			return $this->entries;
		}
		
		#-#############################################
		# desc: returns array with entries
		# param: 
		# return: (array) entries
		function next()
		{
			$this->show += 1;
		}
		
		#-#############################################
		# desc: returns message
		# param: 
		# return: (string) message
		function message()
		{
			// entries in array? 
			$message		= $this->entries[$this->show]['wall_text'];
			
			return $message;
		}

	} //CLASS Wall
	###################################################################################################

?>

PHP:
<?php	
							foreach($wall->output() as $entry)
							{			
								
						?>
							<table border="0" width="100%" class="pinfo_table">
								<tr>
									<td rowspan="2" width="100" valign="top">avater</td>
									<td><h5>author vom date</h5></td>
								</tr>
								<tr>
									<td><?php echo $wall->message(); ?></td>
								</tr>
							</table>	
							
							<?php echo $wall->next(); ?>
						<?php
							} 
						?>

Obwohl ich nicht weiß, warum ich eine Foreach Schleife genommen habe und warum ich as $entry dort habe.

Gruß
David
 
Eine Foreach Schleife iteriert über das erste element und gibt jeden arrayeintrag in die variable des zweiten elements ;)

Allerdings muss die Ausgabe so aussehen:
PHP:
<?php    
                            foreach($wall->output() as $entry)
                            {            
?>
                            <table border="0" width="100%" class="pinfo_table">
                                <tr>
                                    <td rowspan="2" width="100" valign="top">avater</td>
                                    <td><h5>author vom date</h5></td>
                                </tr>
                                <tr>
                                    <td><?php echo $entry["message"]; ?></td>
                                </tr>
                            </table>    
<?php
                            } 
?>
 
Zuletzt bearbeitet:
Zurück