Hi zusammen,
ich habe gerade leider ein ziemlich kniffliges Problem. Bei der Lösungssuche im Internet bin ich auch schon über Begriffe wie Strategy Pattern oder Decorator Pattern gestolpert, bin mir aber nicht sicher, ob das wirklich das Mittel zum Zweck ist.
Vorab, als Vergleich, was ich erreichen will: Auf php.net gibt es zu mysqli_fetch_array einen kleinen Code Snippet, siehe (ich habs etwas gekürzt):
Es wird in diesem Beispiel eine Methode fetch_array() auf das Objekt $result angewendet. Das ist letzten Endes genau das, was ich auch erreichen will. Ich will eine Methode, die ich jederzeit auf beliebig viele Objekte anwenden.
Was ich bisher gebastelt habe:
Klasse:
So, jetzt kommts zu dem Problem-Part:
Nur $data_b ist mit Inhalten gefüllt. $data_a ist leer. Das liegt an der Funktionsweise von getAll(); Eigentlich soll die Methode alle Datensätze der Datenbankabfrage liefern, über das Objekt, über das es aufgerufen wird.
Also:
Es wird aber aufgrund der Implementierung von $this->result->fetch_array() in der Methode getAll() logischerweise immer nur das Result der zuletzt durchgeführten Datenbankanfrage verwendet, nicht aber des Results, auf das ich mittels dem Pfeil -> verweise.
Meine Frage ist: Wie muss ich die Methode getAll() umgestalten, dass ich sie nach dem gleichen Prinzip verwenden kann, wie die php-Entwickler das in ihrem Beispiel auf der Php-Seite mittels folgendem Code machen:
Aus meiner Sicht erlaubt solch eine Arbeitsweise eine enorme Flexibilität und ich will in jedem Fall eine saubere Lösung. Klar gibt es Workaround (ich könnte die betroffene Query z.B. als Argument der Methode übergeben), aber ich will in diesem Fall mal ausnahmsweise was gescheites auf die Beine stellen
Ich hab mir schon einige Tutorials bezüglich Decorator Patterns angesehen, aber da werden plötzlich viele Klassen ins Leben gerufen und ich bin mir nicht ganz sicher, ob das auch die Korrekte arbeitsweise in diesem Fall ist. Weil in diesem Fall müsste ich ja dann pro Query ebenfalls eine eigene Klasse erstellen, oder? a la:
Dadurch würden dann auch etliche DB-Connects durchgeführt werden, weil der Konstruktor der Klasse mysqldb logischerweise die Datenbankverbindung herstellt.
Fragen über Fragen, über jegliche Hilfe, sei es auch nur ein kleiner Denkanstoß, wäre ich wahnsinnig dankbar.
Vielen Dank soweit!
ich habe gerade leider ein ziemlich kniffliges Problem. Bei der Lösungssuche im Internet bin ich auch schon über Begriffe wie Strategy Pattern oder Decorator Pattern gestolpert, bin mir aber nicht sicher, ob das wirklich das Mittel zum Zweck ist.
Vorab, als Vergleich, was ich erreichen will: Auf php.net gibt es zu mysqli_fetch_array einen kleinen Code Snippet, siehe (ich habs etwas gekürzt):
PHP-Code:
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");
$query = "SELECT Name, CountryCode FROM City ORDER by ID LIMIT 3";
$result = $mysqli->query($query);
$row = $result->fetch_array();
Was ich bisher gebastelt habe:
Klasse:
PHP-Code:
class mysqldb extends mysqli
{
/**
* DB Verbindung herstellen und Charset setzen
*/
public function __construct()
{
// DB Verbindung
}
/**
* Führt die Datenbankanfrage durch
*/
public function query ($sql)
{
$this->result = parent::query($sql);
return $this;
}
/**
* Liefert alle Datensätze der abgefragten SQL Query
*/
public function getAll ()
{
while ($row = $this->result->fetch_array())
{
$data[] = $row;
}
return $data;
}
}
PHP-Code:
$mysqldb = new mysqldb();
$result_a = $mysqldb->query('SELECT bla');
$result_b = $mysqldb->query('SELECT blub');
$data_a = $result_a->getAll();
$data_b = $result_b->getAll();
var_dump($data_a);
var_dump($data_b);
Also:
PHP-Code:
$result_a->getAll(); // soll alle Datensätze der Query A liefern.
$result_b->getAll(); // soll alle Datensätze der Query B liefern.
Meine Frage ist: Wie muss ich die Methode getAll() umgestalten, dass ich sie nach dem gleichen Prinzip verwenden kann, wie die php-Entwickler das in ihrem Beispiel auf der Php-Seite mittels folgendem Code machen:
PHP-Code:
$row = $result->fetch_array();
Ich hab mir schon einige Tutorials bezüglich Decorator Patterns angesehen, aber da werden plötzlich viele Klassen ins Leben gerufen und ich bin mir nicht ganz sicher, ob das auch die Korrekte arbeitsweise in diesem Fall ist. Weil in diesem Fall müsste ich ja dann pro Query ebenfalls eine eigene Klasse erstellen, oder? a la:
PHP-Code:
$mysqldb_a = new mysqldb;
$result_a = $mysqldb_a->query ("SELECT bla...");
$mysqldb_b = new $mysqldb;
$result_b = $mysqldb_b->query("SELECT blubb...");
Fragen über Fragen, über jegliche Hilfe, sei es auch nur ein kleiner Denkanstoß, wäre ich wahnsinnig dankbar.
Vielen Dank soweit!
Kommentar