Funktion und Global Variable Sicherheit ?

Starfox2007

Mitglied
Hi zusammen,

Ich hab heute eigentlich nur eine kurze Sicherheitsfrage.

wenn ich in eine Funktion den MysqlDatenbankzugriff Global importiere wie sicher ist das ?

PHP:
function ($test) {

global $db; // $db ist der Datenbankzugriff steht auch in einer function bei mir.

....


 }
 
So sicher, wie das du dir sicher bist, das $db von keiner anderen Stelle im Code überschrieben wird. Das bedeutet, einmal initalisieren.

Besser wäre es jedoch, wenn du den Datenbank-Zugriff in ein Singleton-Pattern kapselst. Dann bist du dir sicher, das er nie überschrieben werden kann.
 
OK, nehmen wir die als Beispiel. Wie schon gesagt, kannst du ein Singleton-Pattern benutzen. Das geht so:

1. Der Constructor der Klasse ist mindestens protected (besser private)
2. Es gibt eine statische Member-Variable
3. Es gibt eine statische Public-Methode, die getInstance() heißt und immer eine Instanz von der Klasse zurück gibt. Ist noch keine Instanz vorhanden, wird sie erzeugt.

Das sieht dann so im Code aus:

PHP:
class DB_MySQL {
  private $connection = NULL;
  private $result = NULL;
  private $counter=NULL;
 
  // Unsere private statische Member-Variable für die Instanz
  private static $instance;
 
  // Wir machen den Constructor private
  private function __construct($host=NULL, $database=NULL, $user=NULL, $pass=NULL){
	$this->connection = mysql_connect($host,$user,$pass,TRUE);
  	mysql_select_db($database, $this->connection);
  }

  // Wir bauen unsere getInstance()-Methode:
  public static function getInstance()
  {
    if(!self::$instance)
    {
      // Hier steht noch ein bisschen Arbeit an - Variablen reinholen z.B. über einen statischen setter
      self::$instance = new self($host, $database, $user, $pass);
    }

    return self::$instance;
  }
 
  public function disconnect() {
    if (is_resource($this->connection))				
        mysql_close($this->connection);
  }
 
  public function query($query) {
  	$this->result=mysql_query($query,$this->connection);
  	$this->counter=NULL;
  }
 
  public function fetchRow() {
  	return mysql_fetch_assoc($this->result);
  }
 
  public function count() {
  	if($this->counter==NULL && is_resource($this->result)) {
  		$this->counter=mysql_num_rows($this->result);
  	}
 
	return $this->counter;
  }
}

Jetzt fragst du dich vielleicht, was das soll? Nunja, niemand außer der Klasse selbst kann eine Instanz erzeugen, und du hast auch immer die gleiche Instanz (Singleton). Da die getInstance()-Methode statisch ist, kannst du sie von überall aus aufrufen. Z.B. in einer Funktion wie dieser:

PHP:
function getUser($username)
{
  DB_MySQL::getInstance()->query("SELECT * FROM users WHERE username = '$username'");
  while($assocResult = DB_MySQL::getInstance()->fetchRow())
  {
    var_dump($assocResult);
  }
}

Du kannst es auch etwas übersichtlicher haben:

PHP:
function getUser($username)
{
  $db = DB_MySQL::getInstance();
  $db->query("SELECT * FROM users WHERE username = '$username'");
  while($assocResult = $db->fetchRow())
  {
    var_dump($assocResult);
  }
}

Fragen?
 
Zurück