php.de

Zurück   php.de > Webentwicklung > Datenbanken

Datenbanken SQL und Co

Antwort
 
LinkBack Themen-Optionen Bewertung: Bewertung: 1 Stimmen, 5,00 durchschnittlich.
Alt 31.05.2011, 18:27  
Neuer Benutzer
 
Benutzerbild von Pat42
 
Registriert seit: 31.05.2011
Beiträge: 7
PHP-Kenntnisse:
Fortgeschritten
Pat42 befindet sich auf einem aufstrebenden Ast
Standard eigene Datenbank Klasse: PDO feuert keine Exception

Hallo zusammen,

hab mal mit PDO rumprobiert in mir in dem zuge eine kleine Datebank-Klasse gebaut. Sie funktioniert auch. (der Code rennt). Es ist so gedacht dass im Allgemeinen das Model mit ihr kommuniziert (ist hier unrelevant).

1. Könnt ihr mir Optimierungstipps geben? Was ist nicht unbedingt günstig an der klasse?
2. Die Methode doInsert keine Exception, wenn ich einen Fehler einbaue (z.b. Schreibfehler, hier: aus "VALUES" , VALUESSS" mache). Ich frage mich warum?

Ich rufe die klasse Testweise von hier auf:

index.php

PHP-Code:
<?php

    
/*
     *  main. this is supposed to make database calls. sort of. for the time being. 
     */

    
require_once("class.database.php");
    
    
error_reporting ("E_ALL");

    
$DB = new Database();
    
$foo $DB->doSelect('SELECT * FROM tag LIMIT 2');
    
print_r($foo);

    
$arr = Array();
    
$arr['type'] = "pen13";
    
$arr['url'] = "https";
    
$arr['match_id_1'] = "5345";
    
$DB->doInsert('INSERT INTO analytics_data'$arr);
class.database.php

PHP-Code:
<?php

/**
 * a new approach to a PDO enabled database class
 * @author Pat42
 */

class Database {
    
    private 
$db_host "127.0.0.1";
    private 
$db_name "mytable";
    private 
$db_user "root";
    private 
$db_pass "passwort";
    
    public function 
__construct() {
        
        
/**
         * instantinate a new connection
         */
        
        
try {
            
$this->dbh = new PDO('mysql:host='.$this->db_host.';dbname='.$this->db_name$this->db_user$this->db_pass);
            
$this->dbh->setAttributePDO::ATTR_ERRMODEPDO::ERRMODE_EXCEPTION );
            
$this->dbh->exec("SET CHARACTER SET utf8");
            
        } catch (
PDOException $e) {
            
            echo 
"Exception caught: Error!: " $e->getMessage() . "<br/>";
            die();
            
        }
    }
    

    public function 
doInsert($sql$data) {

        
$f1 ""$f2 "";
        foreach (
$data AS $key => $val) {
            
$f1 .= ", " $key;
            
$f2 .= ", :" $key;
            echo 
"f";
        }
        
        try {
            
$statement $this->dbh->prepare($sql "(" substr($f12) . ") VALUES (" substr($f22) . ") ");

            
            foreach (
$data AS $key => $val) {
                
$statement->bindParam(':'.$key.''$data[$key]);
                echo 
"b";
            }    
            
        } catch (
PDOException $e) {
            echo 
"Error while Inserting!: " $e->getMessage() . "<br/><b>$sql</b>";
            die();
        }
        
        if(!
$statement->execute()) {
            
$error $statement->errorInfo();
            throw new 
Exception('cannot create new content: '.$error[2]);
        }
        
    }
    
    
    public function 
doSelect($sql) {
        
        
$result = Array();
        
        try {
            
$statement $this->dbh->prepare($sql);
            
            
$result = Array();
            if(
$statement->execute()) {
                while (
$row $statement->fetch(PDO::FETCH_ASSOC)) {
                    
$result[] = $row;
                }
        }

        }  catch (
PDOException $e) {
            
            echo 
"Error while Selecting!: " $e->getMessage() . "<br/><b>$sql</b>";
            die();
        }
        
        return 
$result;
        
    }
    
    
}
Pat42 ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 31.05.2011, 18:48  
Erfahrener Benutzer
 
Benutzerbild von lstegelitz
 
Registriert seit: 07.09.2009
Beiträge: 4.005
PHP-Kenntnisse:
Fortgeschritten
lstegelitz ist einfach richtig nettlstegelitz ist einfach richtig nettlstegelitz ist einfach richtig nettlstegelitz ist einfach richtig nett
Standard

Zitat:
Zitat von Pat42 Beitrag anzeigen
PHP-Code:
<?php

/**
 * a new approach to a PDO enabled database class
 * @author Pat42
 */

class Database {
    
    private 
$db_host "127.0.0.1";
    private 
$db_name "mytable";
    private 
$db_user "root";
    private 
$db_pass "passwort";
    
    public function 
__construct() {
        
        
/**
         * instantinate a new connection
         */
        
        
try {
            
$this->dbh = new PDO('mysql:host='.$this->db_host.';dbname='.$this->db_name$this->db_user$this->db_pass);
            
$this->dbh->setAttributePDO::ATTR_ERRMODEPDO::ERRMODE_EXCEPTION );
            
$this->dbh->exec("SET CHARACTER SET utf8");
            
        } catch (
PDOException $e) {
            
            echo 
"Exception caught: Error!: " $e->getMessage() . "<br/>";
            die();
            
        }
    }
    

    public function 
doInsert($sql$data) {

        
$f1 ""$f2 "";
        foreach (
$data AS $key => $val) {
            
$f1 .= ", " $key;
            
$f2 .= ", :" $key;
            echo 
"f";
        }
        
        try {
            
$statement $this->dbh->prepare($sql "(" substr($f12) . ") VALUES (" substr($f22) . ") ");

            
            foreach (
$data AS $key => $val) {
                
$statement->bindParam(':'.$key.''$data[$key]);
                echo 
"b";
            }    
            
        } catch (
PDOException $e) {
            echo 
"Error while Inserting!: " $e->getMessage() . "<br/><b>$sql</b>";
            die();
        }
        
        if(!
$statement->execute()) {
            
$error $statement->errorInfo();
            throw new 
Exception('cannot create new content: '.$error[2]);
        }
        
    }
    
    
    public function 
doSelect($sql) {
        
        
$result = Array();
        
        try {
            
$statement $this->dbh->prepare($sql);
            
            
$result = Array();
            if(
$statement->execute()) {
                while (
$row $statement->fetch(PDO::FETCH_ASSOC)) {
                    
$result[] = $row;
                }
        }

        }  catch (
PDOException $e) {
            
            echo 
"Error while Selecting!: " $e->getMessage() . "<br/><b>$sql</b>";
            die();
        }
        
        return 
$result;
        
    }
    
    
}
Puh...

1.) Hardcoded (private!) Properties, Widerverwendbarkeit somit gleich null. Zumindest dem Konstruktor hättest du Argumente spendieren können.
2.) Der Konstruktor macht schon viel zu viel Arbeit... der ist nur zum Initialisieren von Membervariablen gedacht - Connections aufbauen sollte nicht zu seinen Aufgaben zählen.
3.) Exceptionhandling... also wenn schon, dann machs doch auch richtig. Wieso fängst du eine Exception, gibst ne Fehlermeldung aus und beendest dann mit die()? Das macht überhaupt keinen Sinn! Wenn du die Ausnahme nicht beheben kannst, reich sie weiter, dafür wurde das Exceptionhandling erfunden.
3a.) DoInsert - warum ist das execute() nicht mehr im try-Block?


PHP-Code:
$f1 ""$f2 "";
foreach (
$data AS $key => $val) {
  
$f1 .= ", " $key;
  
$f2 .= ", :" $key;
  echo 
"f";

implode()
__________________
Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.
lstegelitz ist offline   Mit Zitat antworten
Alt 31.05.2011, 21:37  
Moderator
 
Registriert seit: 06.06.2008
Beiträge: 4.945
PHP-Kenntnisse:
Fortgeschritten
Wolla ist ein wunderbarer AnblickWolla ist ein wunderbarer AnblickWolla ist ein wunderbarer AnblickWolla ist ein wunderbarer AnblickWolla ist ein wunderbarer AnblickWolla ist ein wunderbarer AnblickWolla ist ein wunderbarer Anblick
Wolla eine Nachricht über ICQ schicken
Standard

PDO ist werksseitig stumm. Du musst erst Sesam-öffne-dich sagen, wenn PDO exceptions werfen soll.
PHP-Code:
$this->dbh = new PDO(mysql:host ...
$this->dbh->setAttributePDO::ATTR_ERRMODEPDO::ERRMODE_EXCEPTION ); 
__________________
Warum denkt mein Hund eigentlich immer dann, wenn es an der Tür klingelt, es sei für ihn?
Wolla ist offline   Mit Zitat antworten
Alt 01.06.2011, 11:31  
Neuer Benutzer
 
Benutzerbild von Pat42
 
Registriert seit: 31.05.2011
Beiträge: 7
PHP-Kenntnisse:
Fortgeschritten
Pat42 befindet sich auf einem aufstrebenden Ast
Standard

Hey. Danke für die Anmerkungen. Lasse gerade einige davon einfliessen.
Freut mich ja schonmal, dass keine groben Schnitzer dabei sind.

Der Grund dafür, dass keine Exception geworfen wurde, war, dass das
Code:
$statement->execute()
nicht im try-Block war. Eigentlich trivial. Aber gestern war es schon spät ^^
Pat42 ist offline   Mit Zitat antworten
Alt 01.06.2011, 14:20  
Erfahrener Benutzer
 
Registriert seit: 30.07.2008
Beiträge: 1.167
PHP-Kenntnisse:
Fortgeschritten
xm22 sorgt für eine eindrucksvolle Atmosphärexm22 sorgt für eine eindrucksvolle Atmosphärexm22 sorgt für eine eindrucksvolle Atmosphäre
Standard

Zitat:
Der Konstruktor macht schon viel zu viel Arbeit... der ist nur zum Initialisieren von Membervariablen gedacht - Connections aufbauen sollte nicht zu seinen Aufgaben zählen.
Das würde ich jetzt so als Faktum nicht da stehen lassen. Meiner Meinung nach passt da durchaus rein, die Verbindung zu initialisieren.
xm22 ist offline   Mit Zitat antworten
Alt 01.06.2011, 14:30  
Erfahrener Benutzer
 
Benutzerbild von mermshaus
 
Registriert seit: 14.06.2009
Beiträge: 1.723
PHP-Kenntnisse:
Fortgeschritten
mermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz sein
Standard

$dbh ist ja auch eine (nicht deklarierte) Instanzvariable.

Es wäre möglich, dass $dbh nicht gesetzt ist, wenn weitere Methoden aufgerufen werden.

Auf die try/catch-Blöcke würde ich im Klassencode vielleicht generell verzichten. Auftretende Fehler sollte die aufrufende Stelle verarbeiten.

Ich bin mir übrigens nicht sicher, ob die Sache mit dem try/catch-Block erklärt, wieso doInsert in der Version in #1 keine Fehlermeldung erzeugt.
__________________
Blog | Buch | Kaloa
mermshaus ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Hilfe: datenbank mappen und kopieren M*I*B Datenbanken 29 15.02.2012 21:55
Mehrere Querys klappen in PhpMyAdmin aber nicht in PHP djscaleo Datenbanken 36 15.05.2011 02:00
[Mitmachquiz] Gästebuch mit beliebiger Datenbank Asipak Off-Topic Diskussionen 69 02.03.2011 11:03
Zugriff auf Datenbank per Klasse - Sicherheit etc. faraday PHP Tipps 2010 23 26.08.2010 15:33
Mysql Klasse macht Probleme in verschachtelten / verzweigten SQL Abfragen litterauspirna PHP Tipps 2010 3 16.02.2010 12:54
Grundsatzfrage zu Attributen einer Klasse sloomf PHP Tipps 2009 6 25.10.2009 07:14
Datenbank austauschbar machen durch Trennung von konkreter Implementierung Asipak PHP-Fortgeschrittene 10 04.09.2009 00:11
Ist so eine Klasse für MySQL-Datenverarbeitung gut? Leichti PHP-Fortgeschrittene 24 04.07.2009 10:15
Klasse für Objekteigenschaft erzeugen? Asipak PHP-Fortgeschrittene 25 30.05.2009 19:45
SessionHandler - Sessions in einer Datenbank #Avedo Software-Design 11 04.05.2009 15:44
Methode einer anderen Klasse aufrufen Luka PHP-Fortgeschrittene 15 09.11.2008 14:19
klasse: Datenbank - Verwaltung dh1sbg PHP Tipps 2007 1 12.08.2007 20:32
Fehler in datenbank klasse Fraylman PHP Tipps 2005 6 18.05.2005 20:34
Datenbank Klasse PHP Tipps 2004-2 6 25.11.2004 20:07
Klasse ändern UniQ PHP Tipps 2004 5 24.08.2004 14:46

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
dbklasse pdo, datenbankklasse pdo, pdo datenbank klasse, pdo class, pdo klasse, php,pdo,datenbankklasse, catch pdoexception, php datenbank klasse pdo, eigene mysql klasse mit pdo extension php, eigene php pdo klasse, php datenbank klasse, php database class 2011, datenbankklasse php pdo, exception php class, wie öffne ich pdo, eigene pdo klasse, pdo exeptions, exception datenbanken, php eigene pdo klasse, php eigene pdo classe

Alle Zeitangaben in WEZ +2. Es ist jetzt 11:49 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum