MySQL-Verbindung über PDO herstellen?
Ich habe hier eine Datei, die ich nicht verändern kann, weil sie automatisch generiert wird.
<?php
class DATABASE_CONFIG {
var $default = array(
'driver' => 'mysql',
'persistent' => false,
'host' => 'localhost',
'login' => 'benutzername',
'password' => 'MeinPasswort',
'database' => 'datenbankname',
'prefix' => '',
);
}
Leider kann ich über mein System diese Datenbankinformationen nur über PDO abrufen. Das sähe dann so aus:
$pdo = new PDO("mysql:host=$db_host;dbname=$db_name", $db_user, $db_password);
Wie kann ich hierbei die einzelnen Strings (von oben) den Variablen zuordnen?
Wenn ich das Script jetzt ausführe (nur die obere Datei eingebunden), bekomme ich diese Fehlermeldung:
Error 500
AH01071: Got error 'PHP message: PHP Fatal error: Cannot redeclare class DATABASE_CONFIG in /var/www/vhosts/MEINESEITE.com/SUB.MEINESEITE.com/include/config/database.php on line 4\n'
Wenn man ein bisschen googelt findet man als Lösung bzw. Fehlerermittlung, dass es diese Klasse schon gibt. Allerdings bin ich mir ziemlich sicher, dass ich diese Klasse noch nirgendwo eingebunden habe.
4 Antworten
Wie kann ich hierbei die einzelnen Strings (von oben) den Variablen zuordnen?
Indem du ein Objekt der Klasse DATABASE_CONFIG erstellst und dann auf deren Attribut (das assoziative Array) zugreifst. Mittels der Keys kannst du aus diesem Array die notwendigen Werte holen, die du benötigst.
$dbConfiguration = new DATABASE_CONFIG();
$dbConfigurationData = $dbConfiguration->default;
$login = $dbConfigurationData["login"];
// etc. ...
Wenn man ein bisschen googelt findet man als Lösung bzw. Fehlerermittlung, dass es diese Klasse schon gibt.
Ähm... also eigentlich steht genau das bereits ganz eindeutig in der Fehlermeldung. 😶
In der Datei, die vom Website-Root aus unter diesem Pfad: include/config/database.php zu finden ist, wird in Zeile 4 versucht, die Klasse erneut zu deklarieren, obwohl sie bereits bekannt ist. Ich könnte mir gut vorstellen, dass du die Datei irgendwo doppelt inkludierst.
Nutze entweder einen Autoloader, der für dich benötigte PHP-Ressourcen einbindet oder achte darauf, include_once oder require_once zum Inkludieren von PHP-Dateien zu nutzen.
ich glaube so:
$pdo = new PDO("$default['driver']:host=$default['host'];dbname=$default['database']", $default['login'], $default['password']);
oder meinst du was anderes?
Edit:
<?php
class DATABASE_CONFIG { var $default = array( 'driver' => 'mysql', 'persistent' => false, 'host' => 'localhost', 'login' => 'benutzername', 'password' => 'MeinPasswort', 'database' => 'datenbankname', 'prefix' => '', ); }
Warum ist den da am ende ein einzelnes Komma?
Die Variable $default befindet sich in einem Klassenkontext und wird somit von außen nicht einfach so aufrufbar sein.
Da ich das ja nicht in die Dateireinsetzen kann, weil sie sonnst überschrieben wird, hab ich das man direkt unter die einfügung der Datei eingesetzt.
Da kahm allerdings wieder ein Error:
AH01071: Got error 'PHP message: PHP Parse error: syntax error, unexpected '' (T_ENCAPSED_AND_WHITESPACE), expecting identifier (T_STRING) or variable (T_VARIABLE) or number (T_NUM_STRING) in /var/www/vhosts/MEINESEITE.com/SUB.MEINESEITE.com/backend/templates/head.inc.php on line 4\n'
Auf Zeile 4 habe ich dein Script eingefügt.
Dann poste mal DIE ganze PHP und nicht nur die 4 Zeilen, damit man sieht was du da vor hast .. evtl hab ich dich auch missverstanden.
Das hängt damit zusammen, dass im obigen Code versucht wird, Array-Indexer via String-Interpolation miteinander zu verbinden. Mit so etwas kommt PHP allerdings nicht klar. Setze entweder geschweifte Klammern um die einzelnen Ausdrücke oder nehme eine klassische String-Konkatenation vor.
a)
"{$default['driver']}:host={$default['host']};dbname={$default['database']}"
b)
$default['driver'].":host=".$default['host'].";dbname=".$default['database']
Probier es mal so:
$db = new DATABASE_CONFIG;
$pdo = new PDO($db->default['driver'] . ":host=" . $db->default['host'] . ";dbname=" . $db->default['database'], $db->default['login'], $db->default['password']);
Ich kenne deine Dateistruktur nicht, daher weiß ich auch nicht was in deiner head.inc.php steht. Mein Codeschnipsel müsste dahin, wo die Klasse DATABASE_CONFIG bereits bekannt ist, also entweder darunter oder unter das entsprechende include.
Wo soll ich das script hinsetzen?
untendrunter?
In die head.inc.php Datei?
obendrüber?
>>Allerdings bin ich mir ziemlich sicher, dass ich diese Klasse noch nirgendwo eingebunden habe.
Scheinbar schon.
Übrigens ist der Aufbau nicht klassengerecht.
Ein "sauberes" Beispiel:
<?php
class abc{
public $daten = array(/*...*/);
}
$def = new abc;
echo $def->daten["driver"];
?>
Das Komma ist das Trennzeichen für aufgeführte Elemente in einem Array-Initializer. Dieses letzte ist zwar unnötig, aber bei manchen Entwicklern aber auch Teil des Programmierstils. So spart sich der Entwickler beim nächsten Anfügen eines Elements Tipparbeit. Da die Datei eh automatisch generiert wird, kann das Komma aber auch egal sein.