Frage zur Arbeit mit MYSQL-Klasse

daN-the-man

Grünschnabel
Hallo Ihr! Ich habe da mal eine Frage, wenn ich mit einer Mysql-Klasse arbeiten möchte.
Hier erstmal die Klasse, die ich dazu benutze:

PHP:
<?php
/**
 * Klasse für einen MYSQL-Datenbanktreiber
 * 
 * Diese Klasse bietet einen ALLGEMEINEN Datenbank-Treiber
 * für MYSQL 5 Datenbanken.
 *
 * Zum Großteil übernommen aus http://www2.professionelle-softwareentwicklung-mit-php5.de/erste_auflage/
 * 
 * @author Danny
 * @version 0.2
 *
 */
class DB_Mysql {
	
	// Attribute
	private $connection = NULL;
	private $result = NULL;
	
	/**
	 * PHP5 Konstruktor
	 * 
	 * Stellt eine Verbindung zum Datenbankserver her und wählt direkt
	 * die passende Datenbank aus.
	 *
	 */
	public function __construct($host, $database, $user, $password) {
		
		$this->connect($host, $database, $user, $password);
		
	}
	
	/**
	 * Stellt eine Mysql-Datenbankverbindung her
	 * 
	 */
	public function connect($host, $database, $user, $password) {
		
		// Verbindung zum Datenbankserver herstellen
		$this->connection = mysql_connect($host, $user, $password, TRUE)
		    OR die('Fehler beim Aufbau der Datenbankverbindung');
		
		// Datenbank auswählen
		mysql_select_db($database, $this->connection)
		    OR die('Fehler beim Auswählen der Datenbank');
		    
	}
	
	/**
	 * Beendet eine Mysql-Datenbankverbindung
	 *
	 */
	public function disconnect() {
		
		if (is_resource($this->connection)) {
			mysql_close($this->connection);
		}
	}
	
	/**
	 * Sendet eine SQL-Anweisung an das Objekt
	 *
	 * @param string $query
	 */
	public function query($query) {
		if (is_resource($this->connection)) {
			// Falls schon ein Result besteht, dieses löschen
			if (is_resource($this->result)) {
				mysql_free_result($this->result);
			}
			$this->result = mysql_query($query, $this->connection) OR die('Datenbankfehler: '. mysql_error());
		}
	}
	
	/**
	 * Steckt das Ergebnis einer Datenbankabfrage in ein Array
	 *
	 * @return Array mit dem Ergebnis der SQL-Anweisung
	 */
	public function fetchRow() {
		if (is_resource($this->result)) {
			$row = mysql_fetch_assoc($this->result);
		}
		
		if (is_array($row))
			return $row;
		else
			return false;
	}
	
	/**
	 * Ermittelt das Ergebnis einer SQL-Abfrage
	 * 
	 * @return Einzelnes Ergebnis einer Abfrage
	 */
	public function getResult() {
		
		// Existiert ein Abfrageergebnis?
		if (is_resource($this->result)) {
			
			// Gibt es überhaupt einen gefundenen Datensatz?
			if ($this->getNumRows() < 1) {
				return false;
			}
			
			$result = mysql_result($this->result, 0);
			return $result;
			
		} else {
			return false;
		}
	}
	
	/**
	 * Ermittelt die Anzahl gefundener Datensätze
	 *
	 * @return Anzahl der Datensätze
	 */
	public function getNumRows() {
		if (is_resource($this->result)) {
			return mysql_num_rows($this->result);
		} else {
			return false;
		}
	}
	
	/**
	 * Ermittelt die Anzahl der eingefuegten/geaenderten/geloeschten Datensaetze
	 * 
	 * @return Anzahl der Datensaetze
	 */
	public function getAffectedRows() {
		if (is_resource($this->connection)) {
			return mysql_affected_rows($this->connection);
		} else {
			return false;
		}
	}
} 
// DB_Mysql.php

?>

Jetzt habe ich folgende Situation: Sagen wir, ich ziehe mir eine Liste mit Benutzerdaten aus der Datenbank, z.B. userID und userName. Jetzt würde ich gerne wissen wie ich allgemein vorgehe, wenn ich innerhalb der fetchRow-Anweisung ein neues Query absenden möchte. Beispiel:

PHP:
$db = new DB_Mysql($host, $databse, $user, $pass);
$sql = "SELECT userID, userName FROM 'tab_user' WHERE userID < 500";
$db->query($sql);
while ($data = $db->fetchRow()) {
    $sql = "SELECT comment FROM 'tab_comments' WHERE userID = '". $data['userID'] ."'";
    $db->query($sql); // Funktioniert so nicht
    // Weiterer Code...
}

Muss ich dann vorher ne 2. Datenbankverbindung / Instanz der Klasse erstellen, damit ich innerhalb der Schleife nen Query senden kann? Denn wenn ich das gleiche Objekt benutzte und dort ein Query hinsende, dann wird die resource der Schleife ja überschrieben und kann dementsprechend nicht mehr funktionieren.
Wie kann ich da wohl am besten vorgehen? Habe vorher ohne eine Mysql-Klasse gearbeitet, aber ich denke, dass das doch einige Vorteile bringt bzw. Arbeit erspart.

mfg
daN
 
Hallo daN-the-man,

ein SQL-Query in einer Schleife auszuführen ist so ziemlich das unperformanteste was du machen kannst und deutet entweder auf ein schlechtes DB-Design hin oder darauf, dass du SQL nicht ganz ausreizt.
Das ganze könntest du wunderbar mit einem LEFT/RIGHT/INNER/OUTER JOIN lösen.

Gruß

Devil
 
Okay... das leuchtet mir irgendwie ein, dass das sehr unpferformant ist.

Aber wie will ich das z.b. sonst erledigen, wenn ich z.B. von bestimmten usern gewisse Userdetails ziehen möchte und dann auch noch alle Kommentare, die dieser gepostet hat. Kleines Beispiel:

PHP:
$sql = "SELECT username, userlevel, birthday FROM 'tab_users' WHERE id > 100";
$db->query($sql);

if ($db->getNumRows() > 0) {

    while ($user = $db->fetchRow()) {

        // Jetzt alle Kommentare aus 'tab_comments' ziehen, wo die userID = $user['id'] ist
        // Nur wie ohne ne zweite Verbindung?
    }

}

Das kann ich mit einem einzelnen Query doch garnicht aus der Datenbank ziehen, oder? Schließlich brauche ich die userdetails bei jedem Datensatz nur einmal, aber die Kommentare können ja beliebig oft in der Datenbank existieren.
 

Neue Beiträge

Zurück