Datenbankverbindung

Kalito

Erfahrenes Mitglied
Hallo,

ich will mich mit mehreren Datenbank verbinden und habe folgenden Konstrukter geschreiben:
PHP:
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_HOST, DB_VZ_USER, DB_VZ_PW,array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8')); break;
            case 'ci': return 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;
        }
    }
}

Wenn ich aber nun versuche diesen in einer anderen Klasse aufzurufen
PHP:
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::prepare() in

Woran kann das liegen?

Gruß
 
ist die prepare methode in der Klasse "Access" oder in der Klasse "Database"?

Denn bei "Database" müsste der Aufruf so aussehen:
PHP:
sql = this->database->prepare("SELECT password FROM `".$table['ci']['user']."` WHERE username= :username ");
 
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:
class Database{
    function connect_ci(){

      return new PDO(...);
     }
}

und rufe diese dann in der Access auf
PHP:
$CI = new Database;
$ci= $CI->connect_ci();

und die Funktion wie oben weiterführe, dann klappt alles
 
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ß
 
@ 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 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.
 
PHP:
$user = $this->database->quote( $user, PDO::PARAM_STR );

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

$strUser = $objResult->fetch( PDO::FETCH_ASSOC );
Sollte mMn sicher genug sein. :P

Gruß
 
So sollte das passen:
PHP:
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 Database( Database::DB_CI );
$objDBvz = new Database( Database::DB_VZ );

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

$objDBvz->prepare( /* ... */ );
$objDBvz->quote( /* ... */ );
// usw

Gruß
 
Zuletzt bearbeitet:
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:
function bla($arr){$this->database->prepare(...)}


Gruß
 
Zurück