Php OOP und MySqli

James Newtron

Grünschnabel
Einen wunderschönen guten Abend euch allen,
ich hab mir heute mal die Objektorientierte Php Programmierung angeschaut. Das hat soweit fürs erst auch noch relativ gut funktioniert. Naja, Betonung liegt auf relativ.
Jetzt würde ich gerne mit MySql (bzw. MySqli), wie sonst auch immer, auf meine Daten in der Datenbank zugreifen. Das Problem bei mir, das ich es nicht schaffe (so wie ich es gerne hätte), mich zur Datenbank zu verbinden.
Außerhalb der Klasse klappt das, nur wenn die ich das ganze in die klasse rein packe leider nicht mehr.

Hier mal ein gekürztes Beispiel:

PHP:
class Search {
//Datenbankverbindung herstellen
private $mysql = new mysqli('Host', 'Username', 'Password', 'Database'); 
public function Query($keyword) {
	$result = $this->mysql->query('SELECT * FROM table WHERE beschreibung LIKE \'%'.$keyword.'%\'');
    //eigene Funktion um die MySql daten zu Fetchen und für die Ausgabe "Aufzubereiten"
	return $this->Fetch($result); 
	}

Kann mir evtl. jemand sagen wieso das nicht klappt und wie man so etwas, sprich das verbinden zur Datenbank, richtig löst?

Grüße
James Newtron
 
Hi und Willkommen bei tutorials.de :)

Der Code funktioniert also klassenlos? Schon mal gut.

Das Problem: Du kannst Code nicht einfach direkt in die Klasse schreiben,
sondern musst ihn in eine Methode verpacken.
Und die ist in der Klasse.
 
Du könntest das erzeugen der MySQLi-Instanz in einen Konstruktor packen, dann dürfte das funktionieren:

PHP:
class Search {
  private $mysql;
  
  //Datenbankverbindung herstellen
  public function __construct()
  {
    $this->mysql = new mysqli('Host', 'Username', 'Password', 'Database');
  }

  public function Query($keyword) {
    $result = $this->mysql->query('SELECT * FROM table WHERE beschreibung LIKE \'%'.$keyword.'%\'');
    //eigene Funktion um die MySql daten zu Fetchen und für die Ausgabe "Aufzubereiten"
    return $this->Fetch($result); 
  }
 
Hallo Allerseits,
danke für das Herzliche willkommen und auch für die wunderbar Hilfe.

Wenn ich das ganze, wie du es gemacht hast in den Konstruktor packe, dann funktioniert das wunderbar. Vielen Dank.
Soviel ich weiß wird der Konstruktor jetzt immer aufgerufen, wenn ich z.B.:
PHP:
 $Search = new Search;
mache. Ist das nicht zumindest ineffizient oder sogar auf Dauer schädlich oder so, wenn ich dann immer versuche mehrmals zur Datenbank eine Verbindung herzustellen?

Nehmen wir jetzt mal an, ich will mein Script erweitern und hab mehrere Klassen die irgendwie dann irgendwas mit der Datenbank zu tun haben. Dann würde ich die ganze Sache wo ich mich mit der Datenbank verbinde in eine eigene klasse tun?! Aber wie dann drauf zugreifen? Mit dem Doppelpunkt?!
Es währe sehr nett, wenn mir jemand da die "regelkonforme" Methode aufzeigen könnte wie ich Mysql(i) mit mehrere Klasse richtig handle.

Vielen Danke schonmal im Vorraus

Grüße
James
 
Hallo James,

genau man lagert die Datenbank in eine Klasse aus und im Konstruktor der anderen Klassen, die die DB benötigen, wird dann ein Objekt der Datenbankklasse erwartet.

Beispiel mit deiner Klasse:
PHP:
class Search
{
  protected $DB;

  public function __construct(&$DB)
  {
     $this->DB = $DB;
  }
}
$globalDatabaseObject = new Database('username', 'pw' /* ... */);
$mySearch = new Search($globalDatabaseObject);

Außerdem könnte man der Datenbankklasse noch das sogenannte "Singleton"-Pattern verpassen: Hierbei wird nur ein Objekt erstellt, auf das man von außen nur mit einer Funktion zugreifen kann. Außerdem kann man "selber" keine Objekte erstellen.

PHP:
class Database
{
  protected static $instance;

  public $mysqli;
  
  protected function __construct() // Keine Instanzierung von außen!
  {
    $this->mysqli = new mysqli('Host', 'Username', 'Password', 'Database');
  }

  public static function &getInstance()
  {
    if ( !isset(self::$instance) )
      self::$instance = new Database();

    return self::$instance;
  }
}

$database = Database::getInstance();
$mySearch = new Search($database);
Hier kann man so oft wie man will getInstance() aufrufen, es liefert immer das gleiche Objekt zurück.
 
Zurück