tutorials.de Buch-Aktion 05/2012
ERLEDIGT
JA
ANTWORTEN
6
ZUGRIFFE
308
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Divo1984 Divo1984 ist offline Mitglied Gold
    Registriert seit
    Aug 2010
    Beiträge
    128
    Ich habe die folgenden Klassen

    PHP-Code:
    <?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_ERRMODEPDO::ERRMODE_EXCEPTION);
            } 
            catch (
    Exception $e
            {
                
            }
        }
        
        public function 
    __destruct()
        {
            
    //Verbindung zerstören
            
    $dbh=null;
        }
    }
    und

    PHP-Code:
    <?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-Code:
    <?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?
    Geändert von ComFreek (04.02.12 um 17:48 Uhr) Grund: Passwort zensiert.
     

  2. #2
    Avatar von einfach nur crack
    einfach nur crack einfach nur crack ist offline mag Cookies & Kekse
    tutorials.de Premium-User
    Registriert seit
    May 2007
    Ort
    Dresden (Sachsen)
    Beiträge
    1.961
    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.
    Geändert von einfach nur crack (04.02.12 um 17:22 Uhr)
     
    Ich mag:
    • positive Bewertungen meiner Beiträge
    • ein Danke für meine hilfreichen Beiträge

    Dabei kann ich dir helfen: PHP --- Javascript --- Ruby --- Coffeescript --- CSS --- HTML --- Webtechnologien --- Shell --- UNIX

    ... noch was: falls du mit dem Thema hier fertig bist, dann kannst du es auch als erledigt markieren.

  3. #3
    Divo1984 Divo1984 ist offline Mitglied Gold
    Registriert seit
    Aug 2010
    Beiträge
    128
    parent::__construct();

    ist raus, Fehler besteht aber dennoch - warum übergebe ich kein valides Objekt? Wie meinst du das?
     

  4. #4
    Avatar von Raisch
    Raisch Raisch ist offline extraordinary bit
    Registriert seit
    Aug 2011
    Ort
    Berlin
    Beiträge
    333
    Probier es mal damit:
    Code PHP:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    
    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ß
     

  5. #5
    Avatar von saftmeister
    saftmeister saftmeister ist offline Der Saft sei mit dir
    tutorials.de Premium-User
    Registriert seit
    May 2006
    Ort
    There is no place like 127.0.0.1
    Beiträge
    3.521
    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:

    Code php:
    1
    2
    3
    4
    5
    6
    
        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.
     
    Grüße
    --
    Qualität des Codes wird in WTF's/Min gemessen: Je mehr, desto schlechter der Code ;-)

  6. #6
    Divo1984 Divo1984 ist offline Mitglied Gold
    Registriert seit
    Aug 2010
    Beiträge
    128
    Habe es gelöst bekommen Der Fehler lag im Konstruktor der class_DB

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

    PHP-Code:
                try
                {
                    
    $this->dbh=new PDO($connectString$this->DB['user'],
                                       
    $this->DB['password']);
                    
    $this->dbh->setAttribute(PDO::ATTR_ERRMODEPDO::ERRMODE_EXCEPTION);                
                } 
    Es fehlte nur das $this->

    Danke für eure Antworten
     

  7. #7
    Avatar von Raisch
    Raisch Raisch ist offline extraordinary bit
    Registriert seit
    Aug 2011
    Ort
    Berlin
    Beiträge
    333
    Zitat Zitat von Divo1984 Beitrag anzeigen
    Habe es gelöst bekommen Der Fehler lag im Konstruktor der class_DB

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

    PHP-Code:
                try
                {
                    
    $this->dbh=new PDO($connectString$this->DB['user'],
                                       
    $this->DB['password']);
                    
    $this->dbh->setAttribute(PDO::ATTR_ERRMODEPDO::ERRMODE_EXCEPTION);                
                } 
    Es fehlte nur das $this->

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

    Btw, Du kannst die Attribute auch im Konstruktor von PDO setzen:
    Code PHP:
    1
    2
    3
    4
    5
    6
    7
    8
    
    $this->dbh = new PDO(
        $connectString,
        $this->DB['user'],
        $this->DB['password'],
        array(
            PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
        )
    );

    Gruß
     

Ähnliche Themen

  1. Prepared Statements
    Von Kalito im Forum PHP
    Antworten: 1
    Letzter Beitrag: 14.01.12, 11:52
  2. [C99] MySQL C API mit Prepared Statements
    Von Bratkartoffel im Forum C/C++
    Antworten: 2
    Letzter Beitrag: 06.12.11, 11:37
  3. Antworten: 4
    Letzter Beitrag: 16.11.10, 16:36
  4. Antworten: 2
    Letzter Beitrag: 11.12.09, 00:55
  5. PDO - prepared statements & SQL Injections
    Von DJLopez im Forum Relationale Datenbanksysteme
    Antworten: 0
    Letzter Beitrag: 09.04.07, 12:30