OOP - Problem mit prepared Statements bzw. Datenbankverbindung

Divo1984

Erfahrenes Mitglied
Ich habe die folgenden Klassen

PHP:
<?php
class DB
{
	//Datenbankdaten
	private $DB=array('database'=>'battle', 
					  'user'=>'root',
			  		  'password'=>'****');
	protected $dbh;
	
	public function __construct()
	{
		parent::__construct();
		//ConnectString
		$con="mysql:dbname=".$this->DB['database'].
			 			   ";host=localhost";
		try 
		{
			//Verbindung herstellen
			$dbh=new PDO($con, $this->$DB['user'], $this->$DB['password']);
			$this->dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
		} 
		catch (Exception $e) 
		{
			
		}
	}
	
	public function __destruct()
	{
		//Verbindung zerstören
		$dbh=null;
	}
}

und

PHP:
<?php
require 'classes/class_DB.php';

class userManagement extends DB
{
	public $dbh;
	
	
	public function __construct(&$dbh)
	{
		if(is_object($dbh) && ($dbh instanceof PDO))
			$this->dbh=$dbh;
	}
	
	public function add($daten)
	{
		//Daten eintragen
		if(!is_array($daten)) return false;
		try 
		{
			$sql="INSERT INTO user(u_uname, 
								   u_password, 
								   u_email,
								   u_vname, 
								   u_nname, 
								   u_plz, 
								   u_ort, 
								   u_strasse, 
								   u_hnr, 
								   u_geb_tag, 
								   u_geb_mon, 
								   u_geb_jahr, 
								   u_code, 
								   u_aktiv)
							VALUES(:user,
							       :password,
							       :email,
							       :vname,
							       :nname,
							       :plz,
							       :ort,
							       :strasse,
							       :hnr,
							       :geb_tag,
							       :geb_mon,
							       :geb_jahr,
							       :code,
							       :aktiv)";
			
			$result=$this->dbh->prepare($sql);
			$result->bindParam(':user', $daten['uname'], PDO::PARAM_STR,36);
			$result->bindParam(':password', $daten['pw'], PDO::PARAM_STR,32);
			$result->bindParam(':email', $daten['email'], PDO::PARAM_STR,60);
			$result->bindParam(':vname', $daten['vname'], PDO::PARAM_STR,40);
			$result->bindParam(':nname', $daten['nname'], PDO::PARAM_STR,32);
			$result->bindParam(':plz', $daten['plz'], PDO::PARAM_STR,6);
			$result->bindParam(':ort', $daten['ort'], PDO::PARAM_STR,32);
			$result->bindParam(':strasse', $daten['str'], PDO::PARAM_STR,32);
			$result->bindParam(':hnr', $daten['hnr'], PDO::PARAM_STR,7);
			$result->bindParam(':geb_tag', $daten['geb_tag'], PDO::PARAM_STR,2);
			$result->bindParam(':geb_mon', $daten['geb_mon'], PDO::PARAM_STR,2);
			$result->bindParam(':geb_jahr', $daten['geb_jahr'], PDO::PARAM_STR,4);
			$result->bindParam(':code', md5($daten['email'], time()), PDO::PARAM_STR,32);
			$result->bindParam(':aktiv', '0', PDO::PARAM_STR,1);
			$result->execute();
            if($result->rowCount()==1)
            {
                print"Datensatz wurde eingetragen";
                return true;
            }
            else
                return false;			
			
		} 
		catch (Exception $e) 
		{
			
		}
	}
	
}
?>

Dazu folgende Datei, wo das aufgerufen wird:

PHP:
<?php 
require 'classes/class_userManagement.php';

$art=new userManagement($dbh);

if(isset($_POST['send']))
{
	$art->add(array('uname'=>$_POST['uname'],
	                'pw'=>$_POST['pw'],
					'email'=>$_POST['email'],
					'plz'=>$_POST['plz'],
					'ort'=>$_POST['ort'],
					'strasse'=>$_POST['strasse'],
					'hnr'=>$_POST['hnr'],
					'geb_tag'=>$_POST['geb_tag'],
					'geb_mon'=>$_POST['geb_mon'],
					'geb_jahr'=>$_POST['geb_jahr']
	));
}
?>
darunter steht nur der HTML Code mit der Tabelle. Wenn ich dort den Button klicke, kommt folgende Ausgabe:

Fatal error: Call to a member function prepare() on a non-object in C:\xampp\htdocs\battle_final\classes\class_userManagement.php on line 49

Könnt ihr mir sagen, wo mein Fehler liegt?
 
Zuletzt bearbeitet von einem Moderator:
In deinem ersten Code-Schnipsel solltest du das parent::__construct() entfernen, da deine Klasse DB gar keine Elternklasse hat, von der sie erbt. Aber ansonsten sehe ich kein Problem in deinem Skript... oder doch: du übergibst in deinem letzten Beispiel vielleicht kein valides Objekt deinem Konstruktor.
 
Zuletzt bearbeitet:
parent::__construct();

ist raus, Fehler besteht aber dennoch - warum übergebe ich kein valides Objekt? Wie meinst du das?
 
Probier es mal damit:
PHP:
require 'classes/class_DB.php'; 

class userManagement extends DB 
{ 
    public function __construct() 
    { 
        parent::__construct(); // call parent construct
    } 
     
    public function add($daten) 
    { 
        //Daten eintragen 
        if(!is_array($daten)) return false; 
        try  
        { 
            $sql="INSERT INTO user(u_uname,  
                                   u_password,  
                                   u_email, 
                                   u_vname,  
                                   u_nname,  
                                   u_plz,  
                                   u_ort,  
                                   u_strasse,  
                                   u_hnr,  
                                   u_geb_tag,  
                                   u_geb_mon,  
                                   u_geb_jahr,  
                                   u_code,  
                                   u_aktiv) 
                            VALUES(:user, 
                                   :password, 
                                   :email, 
                                   :vname, 
                                   :nname, 
                                   :plz, 
                                   :ort, 
                                   :strasse, 
                                   :hnr, 
                                   :geb_tag, 
                                   :geb_mon, 
                                   :geb_jahr, 
                                   :code, 
                                   :aktiv)"; 
             
            $result=$this->dbh->prepare($sql); 
            $result->bindParam(':user', $daten['uname'], PDO::PARAM_STR,36); 
            $result->bindParam(':password', $daten['pw'], PDO::PARAM_STR,32); 
            $result->bindParam(':email', $daten['email'], PDO::PARAM_STR,60); 
            $result->bindParam(':vname', $daten['vname'], PDO::PARAM_STR,40); 
            $result->bindParam(':nname', $daten['nname'], PDO::PARAM_STR,32); 
            $result->bindParam(':plz', $daten['plz'], PDO::PARAM_STR,6); 
            $result->bindParam(':ort', $daten['ort'], PDO::PARAM_STR,32); 
            $result->bindParam(':strasse', $daten['str'], PDO::PARAM_STR,32); 
            $result->bindParam(':hnr', $daten['hnr'], PDO::PARAM_STR,7); 
            $result->bindParam(':geb_tag', $daten['geb_tag'], PDO::PARAM_STR,2); 
            $result->bindParam(':geb_mon', $daten['geb_mon'], PDO::PARAM_STR,2); 
            $result->bindParam(':geb_jahr', $daten['geb_jahr'], PDO::PARAM_STR,4); 
            $result->bindParam(':code', md5($daten['email'], time()), PDO::PARAM_STR,32); 
            $result->bindParam(':aktiv', '0', PDO::PARAM_STR,1); 
            $result->execute(); 
            if($result->rowCount()==1) 
            { 
                print"Datensatz wurde eingetragen"; 
                return true; 
            } 
            else 
                return false;             
             
        }  
        catch ( PDOException $e )  
        { 
             // TODO: exception output or log?
        }   
        catch (Exception $e)  
        { 
             // TODO: exception output or log?
        } 
    }
}

Gruß
 
Hi,

ich glaub das Problem ist eher, das $dbh null ist, jedenfalls kein Objekt vom Typ PDO. Du kannst mal den Konstruktor von userManagement so umbauen:

PHP:
    public function __construct(&$dbh)
    {
        if(!$dbh instanceof PDO)
          throw new Exception('$dbh ist kein PDO-Objekt!');
        $this->dbh=$dbh;
    }

Im Übrigen gibts seit PHP 5.3 eine Warnung, wenn man Pass-by-reference macht, da ohnehin immer die Referenz übergeben wird.
 
Habe es gelöst bekommen:) Der Fehler lag im Konstruktor der class_DB

vorher:
PHP:
        try 
        {
            //Verbindung herstellen
            $dbh=new PDO($con, $this->$DB['user'], $this->$DB['password']);
            $this->dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        }

jetzt:

PHP:
			try
			{
				$this->dbh=new PDO($connectString, $this->DB['user'],
								   $this->DB['password']);
				$this->dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);				
			}

Es fehlte nur das $this->

Danke für eure Antworten:)
 
Habe es gelöst bekommen:) Der Fehler lag im Konstruktor der class_DB

vorher:
PHP:
        try 
        {
            //Verbindung herstellen
            $dbh=new PDO($con, $this->$DB['user'], $this->$DB['password']);
            $this->dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        }

jetzt:

PHP:
			try
			{
				$this->dbh=new PDO($connectString, $this->DB['user'],
								   $this->DB['password']);
				$this->dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);				
			}

Es fehlte nur das $this->

Danke für eure Antworten:)
Ja solche Kleinigkeiten übersieht man gerne mal. :D

Btw, Du kannst die Attribute auch im Konstruktor von PDO setzen:
PHP:
$this->dbh = new PDO(
    $connectString,
    $this->DB['user'],
    $this->DB['password'],
    array(
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
    )
);

Gruß
 
Zurück