PHP-OOP: "Übergebene" arrayelemente werden nicht berücksichtigt
mike-b
- php
1 dedlfix
Hallo,
habe heute mal angefangen mich mit OOP zu beschäftigen.
Ziel ist, eine Klasse zu erschaffen die Daten aus einer Datenbank ausliest und formatiert in einer Tabelle ausgibt.
Dabei habe ich mir folgenden Code überlegt, der bis auf eine Kleinigkeit auch gut funktioniert:
class select
{
// Funktion zum selecten
function query($sql)
{
$this->result = mysql_query($sql) or die (mysql_error());
}
function getres()
{
$row = mysql_fetch_array($this->result, MYSQL_ASSOC);
return $row;
}
//gibt einen formatierten table aus, mit allen ausgelesenen Daten
function zusammensetzen($ueberschrift,$rowdefinition)
{
//ueberschrift
echo "<table border="1"> \n <tr>$ueberschrift</tr>";
//inhalt
while ($row = $this->getres()) { echo "<tr> $rowdefinition </tr>";}
echo "</table>";
}
}
$db = new select;
$db->query("SELECT * from geraet");
$db->zusammensetzen(
"<td>hier</td><td>ueberschirft</td>",
"<td>$row[verwaltungsnummer]</td> <td>$row[produktname]</td>
");
Damit man also nicht für alle möglichen Abfragen unnötige Codeteile kopieren muss habe ich mir das überlegt.
Mit:
$db->zusammensetzen(
"<td>hier</td><td>ueberschirft</td>",
"<td>$row[verwaltungsnummer]</td> <td>$row[produktname]</td>
");
soll eben festgelegt werden was, wie in der tabelle dargestellt werden soll.
Leider werden diese arrayelemente $row[verwaltungsnummer] .. nicht verarbeitet (das <td> vor bzw </td> nach $row[verwaltungsnummer] aber schon). wenn ich $row[verwaltungsnummer] direkt anstatt $rowdefinition einsetze funktioniert das ganze.
Wie könnte ich dieses Problem lösen?
Danke :)
PS. Designtechnisch ist der phpcode wohl nicht gerade optimiert, ist halt mein erster Tag mit OOP ;-)
PPS: In der Suche konnte ich auch nichts finden, mangels griffigen Suchbegriffen..
echo $begrüßung;
Ziel ist, eine Klasse zu erschaffen die Daten aus einer Datenbank ausliest und formatiert in einer Tabelle ausgibt.
Also eine Klasse, die Dateineingabe und Datenausgabe in einem macht - kein guter Ansatz, wenn man eine Trennung der Programmteile nach EVA-Prinzip als optimal ansieht.
class select
{
// Funktion zum selecten
function query($sql)
{
$this->result = mysql_query($sql) or die (mysql_error());
}
Einfach so das aufrufende Programm mit in den Tod ziehen, wenn in der Klasse ein Fehler aufgetreten ist, gehört nicht grade zum guten Ton. Rückgabe eines Wertes, der den Fehlerzustand angibt (z.B. false oder ein Error-Objekt) oder das Auslösen einer Exception, die man im Hauptprogramm abfangen kann, wären günstiger.
function getres()
{
$row = mysql_fetch_array($this->result, MYSQL_ASSOC);
return $row;
}
Die Zwischenspeicherung in $row ist nicht unbedingt nötig.
//gibt einen formatierten table aus, mit allen ausgelesenen Daten
function zusammensetzen($ueberschrift,$rowdefinition)
{
//ueberschrift
echo "<table border="1"> \n <tr>$ueberschrift</tr>";//inhalt
while ($row = $this->getres()) { echo "<tr> $rowdefinition </tr>";}
echo "</table>";}
}$db = new select;
$db->query("SELECT * from geraet");
$db->zusammensetzen(
"<td>hier</td><td>ueberschirft</td>",
"<td>$row[verwaltungsnummer]</td> <td>$row[produktname]</td>
");
Wenn du beim Entwickeln das error_reporting auf E_ALL stellst, könntest du bemerken, dass du hier auf $row zugreifst, das gar nicht existiert. In mit "" eingefassten Strings werden Variablennamen aufgelöst, und zwar sofort, nicht erst dann, wenn du das möchtest.
Wenn du die Strings in '' notierst, werden die Variablennamen nicht aufgelöst. Dann stehen sie dir innerhalb zusammensetzen() zur Verfügung. Allerdings nur, wenn du den String mit eval() auswertest - keine besonders gute Idee.
Außerdem hast du einige Teile der Ausgabe (<td>) außerhalb der Klasse und einge Teile innerhalb, was auch keine günstige Designentscheidung ist. Klassen sollen eine Aufgabe kapseln und ihre Implementation vor dem Anwender verbergen. Wenn die Klasse schon eine Tabelle ausgeben soll, dann sollte sie das komplett tun.
Und noch eine Kleinigkeit: Why is $foo[bar] wrong?
Wie könnte ich dieses Problem lösen?
Übergib nur die variablen Teile ("hier", "überschrift") ohne die <td> (<th> wären hier besser) drumrum. Diese Werte kannst du in ein Array packen, und innerhalb der Klasse erzeugst du pro Array-Element eine Spalte.
Die Anzahl der Datenspalten kennst du ja schon, wenn du die Daten mit mysql_fetch_*() abgeholt hast, wobei ..._array() nicht gerade günstig ist, weil es die Daten doppelt enthält. ..._assoc() oder ..._row() wären sicher günstiger.
Noch besser fände ich es, wenn die Datenbankabfrageklasse nur eine generische Datensammlung zurückgäbe - ein Array beispielsweise. Die Ausgabe der Daten übernimmt eine eigene Klasse/Funktion. So kann man auch mal die Daten in eine andere Form bringen oder zwischendurch bearbeiten, ohne die Datenabfrageklasse erweitern zu müssen.
echo "$verabschiedung $name";