2016-07-29 39 views
0

Die Klasse Mysqli_result hat fetch_all() Methode, die mehrere Zeilen gleichzeitig aus der Ergebnismenge in Form eines Arrays von Zeilen zurückgibt (tatsächlich ist dies ein zweidimensionales Array, da Zeilen bereits Arrays von Feldern sind). Auch eine Ergebnismenge hat die Methode fetch_object(), die eine einzelne Zeile in Form eines Objekts zurückgibt.So erweitern Sie mysqli_result und fügen neue Methode hinzu

Jetzt möchte ich mysqli_result Klasse erweitern und neue Methode fetch_objects() (Plural) hinzufügen, die ein assoziatives Array von Objekten zurückgeben würde, wo der Assoziationsschlüssel die Datensatz-ID [id => Object()] ist. Natürlich muss ich auch die mysqli-Klasse erweitern und die query() -Methode überschreiben, um meine erweiterte Ergebnismenge zurückzugeben. Aber ich verstehe nicht, wie die Übertragung von Verbindungs- und Abfrageparametern zwischen mysqli und mysqli_result erfolgt.

Dies sollte so funktionieren:

$db=new ReallyMySQLi(...); //initiating my mysqli 

$myrst=$db->query($SQL); //returned my extended result 

//fetch_objects() returning associative array of objects 
//with record ID as associative key 
foreach($myrst->fetch_objects() as $id=>$object) 
{ 
    echo 'Customer ID:'.$id; //or $object->id; 
    echo 'Customer firstname:'.$object->firstname; 
    echo 'Customer lastname:'.$object->lastname; 
} 

Antwort

1

Ich fand dies auf der PHP-Handbuch von mysqli_result und gebastelt einige. Ich habe es nicht versucht.

class Database_MySQLi extends MySQLi 
{ 
    public function query($query) 
    { 
     $this->real_query($query); 
     return new Database_MySQLi_Result($this); 
    } 
} 

class Database_MySQLi_Result extends MySQLi_Result 
{ 
    public function fetch_objects() 
    { 
     $rows = array(); 
     while($row = $this->fetch_object()) 
     { 
      $rows[$row->id] = $row; 
     } 
     return $rows; 
    } 
} 

Und die Nutzung würde

$db=new Database_MySQLi(...); //initiating my mysqli 

$myrst=$db->query($SQL); //returned my extended result 

//fetch_objects() returning associative array of objects 
//with record ID as associative key 
foreach($myrst->fetch_objects() as $id=>$object) 
{ 
    echo 'Customer ID:'.$id; //or $object->id; 
    echo 'Customer firstname:'.$object->firstname; 
    echo 'Customer lastname:'.$object->lastname; 
} 
+0

Schande über mich Ich weiß wirklich nicht, wie ich diese Notiz nicht gefunden habe (obwohl ich einige Zeit in der Suche verbrachte). Allerdings habe ich diesen Code getestet und es funktioniert !!! Aber ich verstehe immer noch nicht, wie es funktioniert !!! Was für eine Anweisung '$ this-> real_query ($ query)' in Database_MySQLi? Auch wenn mysqli 'return new Database_MySQLi_result ($ this) 'ausgibt, setzt es das erweiterte mysqli_result ein und sendet sich selbst als Argument an result, aber der Konstruktor des Ergebnisses hat keine Parameter! Ich bin immer noch verwirrt! – sbrbot

+0

Ich weiß auch nicht über die Real_Query. Ich bin gerade vorbeigekommen und habe eine kleine Recherche gemacht und das gesehen. Ich dachte nur, ich könnte teilen. Gott schütze die öffentlichen, aber undokumentierten Variablen und Methoden! vielleicht hat er die Klasse mysqli_result einfach 'var_dump'eded und herausgefunden. –

+0

Die Verwendung von 'real_query()' anstelle von 'query()' Methode ist hier entscheidend! Ich testete, dieser Code ** arbeitet nicht mit $ $ this-> query ($ query) '. real_query führt die Abfrage aus und lässt das Ergebnis in der Datenbank (ungepuffertes Ergebnis - speichert nur den Zeiger darauf in mysqli) und dieses Ergebnis sollte danach verwendet oder gespeichert werden. – sbrbot

-1

Leider, ich nie als MySQL-Treiber 2 Jahre nutzen mysqli. Aber ich mache diese Empfehlung für dich.

Sie können PDO wählen, PDO ist so cool wie Multiple-Datenbank-Treiber.

Wie Laravel eloquent, verwenden Lehre beide PDO als Grundlage.

$pdo = new PDO('sqlite:db.sqlite'); 
$pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC); 
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

Viel Glück!