tutorials.de Buch-Aktion 05/2012
Seite 1 von 2 12 LetzteLetzte
ERLEDIGT
JA
ANTWORTEN
16
ZUGRIFFE
464
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Kalito Kalito ist offline Mitglied Brokat
    Registriert seit
    Aug 2010
    Ort
    Leipzig
    Beiträge
    380
    Hallo,

    ich will mich mit mehreren Datenbank verbinden und habe folgenden Konstrukter geschreiben:
    PHP-Code:
    include('pass.php'); //für Passwörter und Tabellen

    class Database{

        private 
    $connection Null;
        public function 
    __construct($database){
            switch (
    $database){
                case 
    'vz': return new PDO('mysql:dbname='.DB_VZ_NAME.';host='.DB_HOSTDB_VZ_USERDB_VZ_PW,array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8')); break;
                case 
    'ci': return new PDO('mysql:dbname='.DB_CI_NAME.';host='.DB_HOSTDB_CI_USERDB_CI_PW,array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8')); break;
            }
        }

    Wenn ich aber nun versuche diesen in einer anderen Klasse aufzurufen
    PHP-Code:
    class Access{
        private 
    $database Null;
        function 
    login($user,$password){
             
    $this->database = new Database('ci');
             
    $sql this->prepare("SELECT password FROM `".$table['ci']['user']."` WHERE username= :username ");
            
    $sql ->bindParam(':username',$user);
            
    $sql ->execute();
         }

    kommt folgende Fehlermeldung:

    Fatal error: Call to undefined method Access:repare() in

    Woran kann das liegen?

    Gruß
     
    Ich bin keine Signatur! - Auch wenn`s so aussieht :) - Wirklich!

    Über ein Danke freut sich jeder

  2. #2
    Avatar von H4ckHunt3r
    H4ckHunt3r H4ckHunt3r ist offline Mitglied Silber
    Registriert seit
    Aug 2011
    Ort
    Ennepetal (NRW)
    Beiträge
    66
    ist die prepare methode in der Klasse "Access" oder in der Klasse "Database"?

    Denn bei "Database" müsste der Aufruf so aussehen:
    PHP-Code:
    sql this->database->prepare("SELECT password FROM `".$table['ci']['user']."` WHERE username= :username "); 
     
    Lg H4ckHunt3r
    Auf Danke klicken kostet nichts und weh tut es auch nicht ;)
    Meine Homepage | Mein Projekt | Mein Clan

  3. #3
    Kalito Kalito ist offline Mitglied Brokat
    Registriert seit
    Aug 2010
    Ort
    Leipzig
    Beiträge
    380
    Hallo, sie soll in der Access sein. Die Database.php soll nur für die Verbindung mit der Datenbank zuständig sein.

    Wenn ich den constructer wie folgt schreibe:
    PHP-Code:
    class Database{
        function 
    connect_ci(){

          return new 
    PDO(...);
         }

    und rufe diese dann in der Access auf
    PHP-Code:

    $CI 
    = new Database;
    $ci$CI->connect_ci(); 
    und die Funktion wie oben weiterführe, dann klappt alles
     
    Ich bin keine Signatur! - Auch wenn`s so aussieht :) - Wirklich!

    Über ein Danke freut sich jeder

  4. #4
    Avatar von H4ckHunt3r
    H4ckHunt3r H4ckHunt3r ist offline Mitglied Silber
    Registriert seit
    Aug 2011
    Ort
    Ennepetal (NRW)
    Beiträge
    66
    oh.. mir fällt gerade auf das du bei dem Aufruf das $ vor dem "this" vergessen hast. xD
     
    Lg H4ckHunt3r
    Auf Danke klicken kostet nichts und weh tut es auch nicht ;)
    Meine Homepage | Mein Projekt | Mein Clan

  5. #5
    Avatar von Raisch
    Raisch Raisch ist offline extraordinary bit
    Registriert seit
    Aug 2011
    Ort
    Berlin
    Beiträge
    333
    Warum benutzt Du bei einer einzelnen Abfrage die prepare-Methode? Würde nicht die query-Methode reichen?

    Und warum liest Du das Passwort aus der DB?
    Um es danach mit der Usereingabe zu vergleichen?
    Mach doch direkt eine Abfrage mit Name und Passwort, wenn die Abfrage kein Ergebnis liefert, dann war was falsch.

    Gruß
     

  6. #6
    Kalito Kalito ist offline Mitglied Brokat
    Registriert seit
    Aug 2010
    Ort
    Leipzig
    Beiträge
    380
    @ Raisch: Prepare ist sicherer gegen Injections als querys. Aufgrund der Verschlüsselung der Passwörter muss ich diesen Weg der Abfrag gehen, da ich ansonsten keinen Vergleich heranziehen kann.

    @H4ckHunt3r: das $-Teichen war in meinem Code. Funktioniert trotzdem nicht
     
    Ich bin keine Signatur! - Auch wenn`s so aussieht :) - Wirklich!

    Über ein Danke freut sich jeder

  7. #7
    Kalito Kalito ist offline Mitglied Brokat
    Registriert seit
    Aug 2010
    Ort
    Leipzig
    Beiträge
    380
    Ich glaube ich habe meinen Fehler gefunden. Ich kann ja keinen Konstruker im Konstrukter aufrufen. Wenn ich eine Funktion schreibe, die new PDO zurückgebt ****t alles einwandfrei. Aber so würde ich ja bei jedem query ein neues PDO-Objekt erstellen. Wie kann ich es also so machen, das ich in der Klasse Database ein Datenbankobjekt erstelle, worauf ich dann in allen anderen Klassen zugreifen kann.
     
    Ich bin keine Signatur! - Auch wenn`s so aussieht :) - Wirklich!

    Über ein Danke freut sich jeder

  8. #8
    Avatar von Raisch
    Raisch Raisch ist offline extraordinary bit
    Registriert seit
    Aug 2011
    Ort
    Berlin
    Beiträge
    333
    PHP-Code:
    $user $this->database->quote$userPDO::PARAM_STR );

    $objResult $this->database->query("
        SELECT
            password
        FROM
            `
    {$table['ci']['user']}`
        WHERE
            username = 
    $user;
    "
    );

    $strUser $objResult->fetchPDO::FETCH_ASSOC ); 
    Sollte mMn sicher genug sein. :P

    Gruß
     

  9. #9
    Avatar von Raisch
    Raisch Raisch ist offline extraordinary bit
    Registriert seit
    Aug 2011
    Ort
    Berlin
    Beiträge
    333
    So sollte das passen:
    PHP-Code:
    class Database
    {
        const 
    DB_VZ 0;
        const 
    DB_CI 1;

        private 
    $objPDO null;

        public function 
    __construct$intDatabaseIdentifier )
        {
            switch ( 
    $intDatabaseIdentifier )
            { 
                case 
    self::DB_VZ:
                    
    $this->objPDO = new PDO(
                        
    'mysql:dbname=' DB_VZ_NAME ';host=' DB_HOST,
                        
    DB_VZ_USER,
                        
    DB_VZ_PW,
                        array( 
    PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8;' )
                    );
                break;

                case 
    self::DB_CI:
                    
    $this->objPDO = new PDO(
                        
    'mysql:dbname=' DB_CI_NAME ';host=' DB_HOST,
                        
    DB_CI_USER,
                        
    DB_CI_PW,
                        array( 
    PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8;' )
                    );
                break;

                default:
                    
    // TODO: Exception werfen?
                
    break;
            }
        }

        public function 
    __call$strFunction$arrArguments )
        {
            return 
    call_user_func_array(
                array( 
    $this->objPDO$strFunction ),
                
    $arrArguments
            
    );
        }

        public static function 
    __callStatic$strFunction$arrArguments )
        {
            return 
    call_user_func_array(
                array( 
    'PDO'$strFunction ),
                
    $arrArguments
            
    );
        }
    }

    $objDBci = new DatabaseDatabase::DB_CI );
    $objDBvz = new DatabaseDatabase::DB_VZ );

    // Zugriff auf PDO Methoden
    $objDBci->query/* ... */ );
    $objDBci->exec/* ... */ );

    $objDBvz->prepare/* ... */ );
    $objDBvz->quote/* ... */ );
    // usw 
    Gruß
    Geändert von Raisch (21.01.12 um 21:50 Uhr)
    Kalito bedankt sich. 

  10. #10
    Kalito Kalito ist offline Mitglied Brokat
    Registriert seit
    Aug 2010
    Ort
    Leipzig
    Beiträge
    380
    okay, danke.

    Bei einem steige ich noch nicht richtig durch. Ich habe jetzt meine Database.php in der die oben gezeigte Klasse ist. Daneben habe ich noch eine index.php, in dem der Code dann ablaufen soll und die Acces.php, wo die Klasse Access ist. Nehmen wir an die Acces.php hat 2 Funktionen, dann muss ich ja in jeder Funktion die Database.php includieren und ein neues Datenbankobjekt erstellen. Wie mache ich nun, das ich nur ein Datenbankobjekt erstelle und alle Klassen darauf zugreifen können, so nach dem Motto:
    PHP-Code:
    function bla($arr){$this->database->prepare(...)} 

    Gruß
     
    Ich bin keine Signatur! - Auch wenn`s so aussieht :) - Wirklich!

    Über ein Danke freut sich jeder

  11. #11
    Avatar von Raisch
    Raisch Raisch ist offline extraordinary bit
    Registriert seit
    Aug 2011
    Ort
    Berlin
    Beiträge
    333
    Zitat Zitat von Kalito Beitrag anzeigen
    okay, danke.

    Bei einem steige ich noch nicht richtig durch. Ich habe jetzt meine Database.php in der die oben gezeigte Klasse ist. Daneben habe ich noch eine index.php, in dem der Code dann ablaufen soll und die Acces.php, wo die Klasse Access ist. Nehmen wir an die Acces.php hat 2 Funktionen, dann muss ich ja in jeder Funktion die Database.php includieren und ein neues Datenbankobjekt erstellen. Wie mache ich nun, das ich nur ein Datenbankobjekt erstelle und alle Klassen darauf zugreifen können, so nach dem Motto:
    PHP-Code:
    function bla($arr){$this->database->prepare(...)} 

    Gruß
    Im Konstruktor der Klassen das Datenbankobjekt übergeben und als Eigenschaft speichern würde ich jetzt mal so auf die Schnelle sagen:
    PHP-Code:
    class Access
    {
        private 
    $objDatabase null;

        public function 
    __constructDatabase $objDatabase )
        {
            
    $this->objDatabase $objDatabase;
        }

        private function 
    tuWas()
        {
            
    $this->objDatabase->exec/* ... */ );
        }

        
    /* ... */

    Und da wo Du es brauchst:
    PHP-Code:
    require 'Database.class.php';
    require 
    'Access.class.php';
    // usw

    $objDBci = new DatabaseDatabase::DB_CI );

    $objAccess = new Access$objDBci );

    $objAndereKlasse = new AndereKlasse$objDBci );

    $objGanzAndereKlasse = new GanzAndereKlasse( new DatabaseDatabase::DB_VZ ) ); 
    Gruß
    Geändert von Raisch (21.01.12 um 22:34 Uhr)
    Kalito bedankt sich. 

  12. #12
    Kalito Kalito ist offline Mitglied Brokat
    Registriert seit
    Aug 2010
    Ort
    Leipzig
    Beiträge
    380
    Und schon wieder muss ich mich bedanken, aber trotzdem habe ich noch eine Frage

    Will jetzt meine Login-Funktion aufrufen und diese 2 Parameter übergeben.

    index.php
    PHP-Code:
    require('Klassen/Access.php');
    require(
    'Libraries/php/Database.php');

    $user 'max.mustermann';

    $CI = new Database(Database::DB_CI);
    $access = new Access($CI);
    $result $access->login($user$password);
    var_dump($result); 
    und die Access.php
    PHP-Code:
    class Access{
        private 
    $Database null;

        public function 
    __construct($Database){
            
    $this->Database $Database;
        }

        function 
    login($user,$password){
            
    //Abfrage ob Benutzer existiert
            
    $sql$this->Database->prepare("SELECT password FROM `mitglieder` WHERE username= :username ");
            
    $sql-> bindParam(':username',$user);
            
    $sql-> execute();

            
    $checkPasswort $sql->fetchObject()->password;
           
            return 
    $checkPasswort;
        }

    Jetzt bekomme ich folgenden Fehler: Trying to get property of non-object in Line 25. Das ist die
    PHP-Code:
     $checkPasswort $sql->fetchObject()->password
    Wo hackt es den nun wieder?
     
    Ich bin keine Signatur! - Auch wenn`s so aussieht :) - Wirklich!

    Über ein Danke freut sich jeder

  13. #13
    Avatar von Raisch
    Raisch Raisch ist offline extraordinary bit
    Registriert seit
    Aug 2011
    Ort
    Berlin
    Beiträge
    333
    PHP-Code:
            $checkPasswort $sql->fetchObject(); 
            
            return 
    $checkPasswort->password
    Sollte es mMn heißen.

    //EDIT
    Aber wozu übergibst Du das Passwort an die Methode wenn Du es nicht verwendest?

    //EDIT 2
    Ich denke ein Objekt als Result ist an der Stelle übertrieben:
    PHP-Code:
            $checkPasswort $sql->fetchPDO::FETCH_ASSOC ); 
            
            return 
    $checkPasswort['password']; 
    Geändert von Raisch (21.01.12 um 23:19 Uhr)
     

  14. #14
    Kalito Kalito ist offline Mitglied Brokat
    Registriert seit
    Aug 2010
    Ort
    Leipzig
    Beiträge
    380
    Hm, kommt trotzdem der selbe Fehler.
    PHP-Code:
    $checkPasswort $sql->fetchAll();
    return 
    $checkPasswort
    gibt array(0) { } zurück.

    Hab dann mal den return mit $sql gemacht und es scheint, das er username nicht mit $user ersetzt.

    Momentan ist die Klasse noch nicht fertig. Diese wird noch mit viel mehr Daten gefüttert
     
    Ich bin keine Signatur! - Auch wenn`s so aussieht :) - Wirklich!

    Über ein Danke freut sich jeder

  15. #15
    Avatar von Raisch
    Raisch Raisch ist offline extraordinary bit
    Registriert seit
    Aug 2011
    Ort
    Berlin
    Beiträge
    333
    Versuch es mal damit:
    PHP-Code:
    $stmt $this->Database->prepare"SELECT password FROM mitglieder WHERE username = :username" );
    $stmt->bindParam':username'$userPDO::PARAM_STR );
    $stmt->execute();

    $result $stmt->fetchAllPDO::FETCH_ASSOC );

    return 
    $result
    Kalito bedankt sich. 

Ähnliche Themen

  1. Datenbankverbindung mit C
    Von pb_sergio im Forum C/C++
    Antworten: 0
    Letzter Beitrag: 02.08.07, 10:21
  2. Datenbankverbindung
    Von TcharZ im Forum Visual Basic 6.0
    Antworten: 1
    Letzter Beitrag: 15.09.06, 11:40
  3. Datenbankverbindung
    Von sunflower84 im Forum ASP
    Antworten: 31
    Letzter Beitrag: 02.08.05, 12:15
  4. Datenbankverbindung
    Von Criminalogy im Forum PHP
    Antworten: 4
    Letzter Beitrag: 21.04.05, 21:27
  5. Datenbankverbindung mit ASP an SQL
    Von Nici im Forum ASP
    Antworten: 0
    Letzter Beitrag: 27.10.04, 16:21