echo $begrüßung;
Ich lass mir ja ungern Code vor Füße legen aber in diesem Fall wäre ich dir dankbar wenn du diese "fetchResult()" Fkt. mal hier hin postest...
Also, ich beschränke die Query erledigende Funktion mal auf das Nötigste. Das heißt, sie bekommt ein fertiges Statement ohne dass noch Parameter eingebaut werden können/müssen. Ebenfalls nicht mit berücksichtigt ist das Ermitteln und Zurückgeben von Result-Metadaten wie last_insert_id oder affected_rows.
/**
* Query abarbeiten
*
* @param string $sql ein SQL-Statement
* @param mixed $asObject false: Fetchen als Array
* true: Fetchen als Objekt
* string: Name der zu instantiierenden Klasse
* @param array $objectParams optionale Parameter @see mysqli_result::fetch_object()
* @return array Ergebnismenge als Array mit Arrays oder Objekten
*/
function query($sql, $asObject = false, $objectParams = null) {
$result = array();
$mysqli = $this->_getConnection(); // das ist eine private Methode, die mit ein mysqli-Objekt mit aktiver Verbindung gibt.
$mysqliResult = $mysqli->query($sql, MYSQLI_USE_RESULT);
if (!$mysqliResult)
throw new Exception(...);
if ($mysqliResult instanceof mysqli_result) {
try {
if ($asObject) { // true oder string
if (is_string($asObject)) {
if (!class_exists($asObject))
throw new Exception('class ' . $asObject . ' does not exist.');
} else { // kein Klassenname übergeben, Standard-Klasse verwenden lassen
$asObject = null;
$objectParams = null;
}
while ($row = $mysqliResult->fetch_object($asObject, $objectParams))
$result[] = $row;
} else
while ($row = $mysqliResult->fetch_assoc())
$result[] = $row;
} finally {
// wird unbedingt benötigt, wegen MYSQLI_USE_RESULT @see mysqli::query()
$mysqliResult->free();
}
}
return $result;
}
Zu [1]: In wiefern lohnt es sich eigendlich das zu machen? Lohnt es sich dafür eine Methode zu erstellen? Die dann mit mysqli_free_result das Ergebnis löscht?
Es lohnt sich, wenn es sein muss (wie in meinem Beispiel). Beim Default-Verhalten MYSQLI_STORE_RESULT lohnt es sich, wenn die Ergebnismenge nicht mehr benötigt wird und das Script noch eine Weite weiterläuft und der belegte Speicher freigegeben werden soll.
Ne weitere Frage:
Wenn ich eine Klasse habe und meine Datenbank-Klasse(db) nutzen möchte, dann hole ich mir eine Instanz so:
class beispiel{
private static $dbcon;
public function __construct(){
self::$dbcon=db::getInstance();
}
}
Ich würde die Instanz nicht auf Vorrat holen sondern jeweils in den jeweiligen Methoden, in denen sie benötigt wird und in einer lokalen Variable ablegen.
> Allerdings ginge doch auch direkt:
> b)
> ~~~php
public workWith(){
> db::db_query($sql);
> }
Da db_query eine statische Methode ist.
Für die statische Methode wird ja auch keine Instanz benötigt. du brauchst sie dann nicht abzufragen. Die Frage ist, ob überhaupt eine Instanz benötigt wird oder ob die public-Methoden alle atomar sind und damit statisch sein können. Dann brauchst du nämlich auch kein öffentliches Singleton, um die Instanz zu holen.
Mir ist das erst später aufgefallen da ich atm zum üben eine Newsletterklasse schreibe. So versuche ich perfekt mit der db und der tools Klasse zusammen zuarbeiten.
Manchmal stellt man erst später fest, dass das was man sich ausgedacht hat, wenn es ans Verwenden geht unbrauchbar ist. Deshalb gibt es auch das YAGNI-Prinzip (You ain't gonna need it): Funktinalität erst dann hinzufügen, wenn man sie braucht. Sonst programmiert man umsonst und/oder am eigentlichen Bedarf vorbei.
echo "$verabschiedung $name";