PHP Klassen mit Datenbank verbindung


#1

Hallo,

ich habe eine Datei die die Verbindung zur Datenbank aufbaut und zwei selbst geschriebene Klassen.

Wie kann ich innerhalb der Klassen auf die $db Variable zu greifen ohne das ich in jeder Funktion einen include auf die Verbindungsdatei machen muss, bzw. wie würdet ihr das Umsetzen?

Verbindungsdatei [db.inc.php]:

$db = new mysqli('localhost', 'root', 'root', 'db');

if (mysqli_connect_error())
die('Connect Error (' . mysqli_connect_errno() . ') '. mysqli_connect_error());

if (!$db->set_charset("utf8"))
die("Datenbank Verbindung konnte nicht auf UTF-8 erfolgreich hergestellt werden.");

Beispielklasse:

class Fahrzeug
{
private $id = 0;
private $nummer;

function __construct($id = NULL, $wagen = NULL, $kennzeichen = NULL)
{
	include(__DIR__ ."/../inc/db.inc.php");
	if (!empty($id)) 
		$this->id = $id;
	else 
	{
		# Fahrzeug prüfen
		$result = $db->query("SELECT ...
		[...]
	}
}

function getWagen()
{
	return $this->nummer;
}

function getKennzeichen($timestamp = NULL)
{
	include(__DIR__ ."/../inc/db.inc.php");
	$timestamp = date('Y-m-d H:i:s');
	$result = $db->query("SELECT ...
	[...]
}
}

P.S.: Cool neues Design im Forum, aber der Editor ist gewöhnungsbedürftig :see_no_evil:

Gruß
Ryon


#2

Hi

du kannst einfach diese Codezeile am Anfang jeder Klasse setzten und dann damit arbeiten.

$pdo = new PDO(‘mysql:host=localhost; dbname=dein_blaced_benutzername’, ‘dein_blaced_benutzername’, ‘dein_db_passwort’);

Das funktioniert bei mir super.

Viele liebe Grüße
Tom


#3

Hi Ryon,

die unschöne aber einfachste Variante wäre einfach mit der globalen Konstanten: $GLOBALS['db']. Siehe: http://php.net/manual/de/reserved.variables.globals.php

Schöner wäre es, wenn du eine DB class schreibst und lässt die Fahrzeug class diese erweitern:
z.B.: (kurz Skizziert):

<?php
class DB {
 
 private $DB = null;
 
 // version 1
 function __construct(){ // oder als constructor und eigener variable
  $db = new mysqli('localhost', 'root', 'root', 'db');
  [...]
  $DB->$db;
 }
 
 // version 2
 private function connect(){
  $db = new mysqli('localhost', 'root', 'root', 'db');
  if (mysqli_connect_error())
  exit('Connect Error (' . mysqli_connect_errno() . ') '. mysqli_connect_error()); // hier habe ich das die() durch exit() ausgetauscht (ist einfach freundlicher :P)
  
  if (!$db->set_charset("utf8"))
  exit("Datenbank Verbindung konnte nicht auf UTF-8 erfolgreich hergestellt werden.");
  return $db;
 }
 
}

class Fahrzeug extends DB {
 
 function getKennzeichen($timestamp = NULL) {
  
  $timestamp = date('Y-m-d H:i:s');
  $result = $this->db->query("SELECT ..."); // version 1
  $result = $this->connect()->query("SELECT ..."); // version 2
  
  return $result;
 }
 
}

$output = new Fahrzeug();
$output->getKennzeichen();

?>

siehe: http://php.net/manual/de/language.oop5.inheritance.php

In dem Code habe ich nur deine bereits vorhanden Funktionen eingesetzt und nicht auf Sicherheit etc. geachtet. z.B.
http://php.net/manual/de/mysqli.real-escape-string.php
oder direkt
http://php.net/manual/de/book.pdo.php


#4

Hallo,

vielen Dank für eure Antworten. Ich werde mir mal dazu Gedanken machen. :slight_smile:

Gruß
Flo