Problem mit PDO Klasse

nchristoph

Erfahrenes Mitglied
Hallo Zusammen,

folgendes Problem: Meine PDO Klasse streikt über Nacht.

PHP:
<?php

class class_dbase {
  private $dbhost = 'localhost';
  private $dbuser = 'test';
  private $dbname = 'root';
  private $dbpass = '';
  private $dbdriver = 'mysqli';   

  private $dbh;
  private $error;
  private $stmt;
   
  public function __construct(){
  // Set DSN
  $dsn = $this->dbdriver.':host=' . $this->dbhost . ';dbname=' . $this->dbname;
  // Set options
  $options = array(
  PDO::ATTR_DRIVER_NAME => $this->dbdriver,
  PDO::ATTR_PERSISTENT => false,
  PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION ,
  PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
  PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL
   
  );
  // Create a new PDO instanace
  try{
  $this->dbh = new PDO($dsn, $this->dbuser, $this->dbpass, $options);
  }
  // Catch any errors
  catch(PDOException $e){
  $this->error = $e->getMessage();
  }
  }
   
  public function query($query){
  $this->stmt = $this->dbh->prepare($query);  //Hier ist das Problem!!!
  }
   
  public function bind($param, $value, $type = null){
  if (is_null($type)) {
  switch (true) {
  case is_int($value):
  $type = PDO::PARAM_INT;
  break;
  case is_bool($value):
  $type = PDO::PARAM_BOOL;
  break;
  case is_null($value):
  $type = PDO::PARAM_NULL;
  break;
  default:
  $type = PDO::PARAM_STR;
  }
  }
  $this->stmt->bindValue($param, $value, $type);
  }
   
  public function execute(){
  return $this->stmt->execute();
  }
   
  public function resultset(){
  $this->execute();
  return $this->stmt->fetchAll(PDO::FETCH_ASSOC);
  }
   
  public function single(){
  $this->execute();
  return $this->stmt->fetch(PDO::FETCH_ASSOC);
  }
   
  public function rowCount(){
  return $this->stmt->rowCount();
  }
   
  public function beginTransaction(){
  return $this->dbh->beginTransaction();
  }
   
  public function endTransaction(){
  return $this->dbh->commit();
  }
   
  public function cancelTransaction(){
  return $this->dbh->rollBack();
  }
   
  public function debugDumpParams(){
  return $this->stmt->debugDumpParams();
  }
   
  public function __destruct(){}
}

?>

Wenn ich jetzt das Objekt der Klasse erstelle und ausführe mit

PHP:
  $db_conn = new class_dbase();

  $sql = "SELECT pagetitle, divider, subtitle FROM cms_config";
  /* $stmt = $db_conn->prepare($sql);
  $stmt->execute();
   
  $row = $stmt->fetch();*/
  $db_conn->query($sql);
  $db_conn->execute();
  $row = $db_conn->single();

Kriege ich folgende Fehlermeldung:
Code:
Fatal error: Call to a member function prepare() on a non-object in C:\xampp\htdocs\includes\class_dbase.php on line 37

Zeile 37:
PHP:
  public function query($query){
  $this->stmt = $this->dbh->prepare($query);  //Hier ist das Problem!!!
  }

Ich hab keine Idee warum. Gestern hats noch funktioniert, heute wollte ich weiterprogrammieren und jetzt kommt die Fehlermeldung. Auch zurücksetzen auf eine frühere Version hat nicht geholfen. Am Server und auch Lokal dasselbe Problem.

Ich bin am Ende mit meinem Latein.
 
Debuggen.

PHP:
public function query($query)
{
    $this->stmt = $this->dbh->prepare($query);  //Hier ist das Problem!!!
    if (!$this->stmt) {
        echo "\nPDO::errorInfo():\n";
        print_r($dbh->errorInfo());
    }
}
 
Jetzt erhalte ich diese Fehlermeldung.

Code:
PDO::errorInfo(): 
Fatal error: Call to a member function errorInfo() on a non-object in C:\xampp\htdocs\includes\class_dbase.php on line 39

Am einfachsten wir wahrscheinlich sein, ich fange nochmal von vorne an mit der Klasse.
 
Dein PDO-Objekt scheint schon nicht angelegt zu werden.

PHP:
  try{
  $this->dbh = new PDO($dsn, $this->dbuser, $this->dbpass, $options);
  }
  // Catch any errors
  catch(PDOException $e){
  $this->error = $e->getMessage();
  }

Frag mal $this->error ab.
 
Danke das wars. Ich hab mir $this->dbh auch ausgeben lassen und das war leer.

Es liegt tatsächlich daran, das das Objekt nicht erstellt wurde.

Hab den MySQL und Apacheserver neu gestartet, jetzt hab ich nur noch das Problem, dass PDO den MySQL Treiber nicht mehr erkennt.
 
Zuletzt bearbeitet:
Erscheint denn MySQLi unter den Modulen (z.B. bei phpinfo)?

<?php phpinfo(); ?>

Das riecht so start nach einem Update, was dir alles zerschossen hat.
 
Hallo,

ich hab Xampp lokal laufen und aufn Server läuft Debian mit Lamp.

Update wurde nicht gemacht, wüsste ich weil ich es machen müsste:p

Nachdem ich alles mehrfach neu gestartet hatte, gings wieder ohne Probleme.

Trotzdem Danke für deine Hilfe.
 
So wie ich das sehe, gibt es die Methode "prepare" doch gar nicht im Objekt "dbh". Es mag sein, das die Methode in der (php-internen) PDO-Klasse vorhanden ist, aber im Objekt "dbh" fehlt sie.
 
Jain. Das Problem lag hier, wie gesagt, darin, dass die Instanziierung fehlschlug. Wenn die klappt (weil Zugangsdaten korrekt und mysqli-Treiber vorhanden und dergleichen), dann ist $dbh eine PDO-Instanz und verfügt auch über eine prepare-Methode.
 
Stimmt, ich muß mich auch gerade mit PDO beschäftigen (auch ein abstrakter Datenbank-Layer), wo ich auf die verschiedenen Engines umschalten kann :)
 
Zurück