• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Trotz catch: Uncaught Exception

vitus37

Senior HTML'ler
### ERLEDIGT ###
siehe Lösung in #1


Hallo,

habe auch mal wieder ein Problem, diesmal mit einer Exception.

Es handelt sich um folgenden Code-Abschnitt:
PHP:
	try{
	    self::$db = new \PDO(
		    $DB_INFO['type'].':dbname='.$DB_INFO['dbname'].';host='.$DB_INFO['host'],
		    /*$DB_INFO['dbuser']*/'iurbvn',
		    $DB_INFO['dbpass'],
		    array(\PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\'')
	    );
	}
	catch(PDOException $e){
	    print 'Connection to database failed: '.$e->getMessage();
	}

Ich erzeuge ein PDO-Objekt und provoziere im Konstruktor den Wurf einer Exception, indem ich einen falschen Benutzernamen angebe.

Doch scheinbar wird die Exception vom folgenden catch-Block nicht gefangen. Ich erhalte eine „Uncaught Exception“-Fehlermeldung:
Code:
<br />
<b>Fatal error</b>:  Uncaught exception 'PDOException' with message 'SQLSTATE[28000] [1045] Access denied for user 'iurbvn'@'localhost' (using password: YES)' in /.../vlCMS/vlModel.php:28
Stack trace:
#0 /opt/lampp/htdocs/netbeans/vlCMS/vlModel.php(28): PDO-&gt;__construct('mysql:dbname=vl...', 'iurbvn', '*******', Array)
#1 /.../vlCMS/vlFrontController.php(21): vl\Model::init()
#2 /.../vlCMS/index.php(8): vl\FrontController::init()
#3 {main}
  thrown in <b>/.../vlCMS/vlModel.php</b> on line <b>28</b><br />

Ich komme nicht drauf, weshalb die PDOException nicht gefangen wird. :shock:

Bei SelfHTML habe ich ein ähnliches Phänomen entdeckt, hat mir aber leider nicht weiter geholfen: SELFHTML Forumsarchiv / 2009 / Januar / Uncaught exception 'Exception'

Der restliche Code der Klasse:
PHP:
abstract class Model{
    
    private static $db;  
    
    private function __construct(){}
    
    public static function __callStatic($name, $params){
	return call_user_func_array(array(self::$db, $name), $params);
    }
    
    public static function init(){
	global $DB_INFO;
	try{
	    self::$db = new \PDO(
		    $DB_INFO['type'].':dbname='.$DB_INFO['dbname'].';host='.$DB_INFO['host'],
		    /*$DB_INFO['dbuser']*/'iurbvn',
		    $DB_INFO['dbpass'],
		    array(\PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\'')
	    );
	}
	catch(PDOException $e){
	    print 'Connection to database failed: '.$e->getMessage();
	}
    }
    
}


// in vlFrontController.php Zeile 21:
Model::init();
Zeile 28 ist das ");" des PDO-Konstruktors.
Meine PHP-Version ist 5.3.5. (LAMPP)

Btw. Wenn ich den korrekten Benutzernamen angebe funktioniert natürlich alles.

Hoffe jemand findet den Fehler :)

Gruß
Vitus
 
Zuletzt bearbeitet:
Werbung:
Ich habe den Fehler jetzt gefunden.

Die Klasse Model liegt im Namespace "vl", PDOException jedoch im globalen Namensraum. Musste anstatt
PHP:
catch(PDOException $e)
folgendes benutzen:
PHP:
catch(\PDOException $e)

Sorry, für den unnötigen Thread (vielleicht hilft er trotzdem jemandem).

Gruß
 
Mehrere Datenbankverbindung unterstützt deine Klasse nicht? Bei so vielen statischen Methoden und __callStatic muss was faul sein.

Und ist das wirklich ein Model oder nur ein Gateway/Wrapper zu einer Datenbank?
 
Werbung:
Ich wollte von jeder Klasse aus auf eine DB-Verbindungsklasse zugreifen und dachte mir, das ginge mit einer Klasse mit statischen Methoden am simpelsten. Da die (bevorzugte) PDO-Klasse jedoch keine solche Methoden anbietet, habe ich mir durch obigen Code eine alternative Lösung gebastelt.

Mehr als eine DB-Verbindung benötige ich derzeit nicht, joa, „Model“ ist in diesem Fall der falsche Bezeichner.
 
Da hättest du auch eine PDO-Instanz in eine Registry packen können. Wenn du was professionelles willst, dann nimm doch Zend_Db, da kannst dann auch einfach deine eigene Models/Mapper aufbauen.
 
Danke für den Tipp mit der Registry, da war ich noch garnicht drauf gekommen. :)

Auf Zend möchte ich erstmal verzichten und mich selbst in die Materie der Softwarearchitektur einarbeiten.

Gruß
 
Werbung:
Ich kann nur empfehlen, nicht zu lange damit zu warten, dir Frameworks und/oder bestehende Klassen anzuschauen. Das heißt ja nicht, dass du nicht dennoch dein eigenes Ding machen kannst, aber es erweitert den Horizont doch ganz ungemein.
 
Zurück
Oben