PDO in Funktionen

Registrierer

Erfahrenes Mitglied
Fange gerade an alles auf PDO umzustellen, wie verwende ich das Objekt in Funktionen?
PHP:
try {
 $pdo          = new PDO($server, $db_user, $password, $options);
}
catch (PDOException $e) {
 exit("Verbindung fehlgeschlagen!");
}
$stmt = $pdo->query('SELECT foo FROM bar'); // funktioniert

function logged_in () {
 $stmt = $pdo->query('SELECT foo FROM bar'); // funktioniert nicht
}
 
Du hast offensichtlich kein Problem mit PDO, sondern ein grundsätzliches Verständnisproblem, in welchem Bereichen Variablen gültig sind. Insofern würde ich Dir raten, dass Du Deine Verbindung als Singleton-Pattern umsetzt (so Du nur eine Verbindung brauchst) und dann kannst Du es wie folgt verwenden:
PHP:
class DatabaseConnection {
  private static $instance = null;

  public static function instance() {
    return (
      self::$instance === null
        ? self::$instance = self::create_instance()
        : self::$instance
    );
  }

  private function __construct() {}

  private static function create_instance() {
    return new PDO( /* server */, /* username */, /* password */, /* options */ );
  }
}

function logged_in() {
  $conn = DatabaseConnection::instance();
  $conn->query( /* statement */ );
}

Nachtrag: Ich hatte einen kleinen Denkfehler drin und habe es jetzt so geändert, dass es funktionieren müsste.
 
Zuletzt bearbeitet:
Du hast offensichtlich kein Problem mit PDO, sondern ein grundsätzliches Verständnisproblem, in welchem Bereichen Variablen gültig sind.
Ich verdiene mein Geld mit was anderem, da darf man das "noch" nicht wissen ;-)
Deine Klasse hab ich leider nicht zum laufen gebracht, mit dieser funktioniert es:
PHP:
class Database {
    private static $PDOINSTANCE;
    private static $HOST = 'localhost';
    private static $USER = 'mysqluser';
    private static $PASS = 'password';
    private static $BASE = 'database';
    private static $CHAR = 'utf8';
    private static $PORT = 3306;
    
    private function __construct() {}
    private function __clone() {}
    
    public static function getInstance() {
        if(!self::$PDOINSTANCE) {
            self::$PDOINSTANCE = new PDO('mysql:host='.self::$HOST.';dbname='.self::$BASE.';charset='.self::$CHAR.';', self::$USER, self::$PASS);
        }
        return self::$PDOINSTANCE;
    }
}

Aber vielen Dank für das Beispiel, ich versteh das zwar noch nicht in Gänze aber das wird schon noch...
 
Ups, ich hatte da einen Denkfehler drin. Den habe ich jetzt in meinem ersten Beitrag entfernt. Aber solange es bei Dir jetzt läuft, ist es auch okay.
 
Zurück