Matti: mysqli_result

Beitrag lesen

Hallo,

aber wie speicher ich das mysqli-Objekt Global?

gar nicht. Gewöhn dir globale Variablen von Anfang an ab. Nutze stattdessen Dependency Injection. Es beschreibt, dass die Klassen ihre Abhängigkeiten übergeben bekommen (injected), anstatt dass diese danach fragen müssen (etwa in globalen Variablen). Dies sorgt dafür, dass deine Klassen saubere Boundaries haben, die dir später das Testen stark erleichern werden.

Frage sich nur, von welcher Klasse ich da rede: ArtikelRepository. Wie du anhand des Namens erkennen kannst, empfehle ich dir, hier direkt das Repository-Pattern zu verwenden. Geh zunächst mal einen Schritt zurück vom Code und überlege dir, was du da hast.

Du hast einen Datenspeicher (in diesem Fall eine relationale Datenbank, mysql), und darin sind Business-Objekte von dir gespeichert (Artikel). Das Repository beschreibt eine Möglichkeit, auf einen Datenspeicher zuzugreifen. In Ermangelung von UML-Künsten meinerseits ohne Zeichnung: das Repository hat eine Methode, die als Parameter die id bekommt und dein Artikel-Objekt zurückgibt. Das Repository braucht dabei intern die mysql-Verbindung.

Also probier mal zum Start sowas hier:

$mysqli = new mysqli(/* ... */);
$repo = new ArtikelRepository($mysqli);
$artikel = $repo->findById(1);

class ArtikelRepository {
   private $mysqli;
   public function __construct($mysqli) {
      $this->mysqli = $mysqli;
   }

   public function findById($id) {
      $res = $this->mysqli->query(/*...*/);
      $obj = $res->fetchAssoc(); // kenne die genaue Syntax nicht mehr
      return new Artikel($obj->name, $obj->preis /* usw *);
   }
}

class Artikel {
   private $name;
   private $preis;

   public function __construct($name, $preis) {
      $this->name = $name;
      $this->preis = $preis;
   }
}

Wie gesagt: wenn dir die Klasse Artikel nicht brauchst (im Sinne von Domain-Driven Design willst du dort deine Business-Logik ablegen!), kannst du in findById auch direkt $res->fetchAssoc() zurückgeben, dann hast du in $artikel ein assoziatives Array mit deinen Tabelleninhalten.

Viele Grüße, Matti