Wat hier fout gaat is dat een constructor nooit iets mag returnen. Verder hoort een PDO/MySQL verbinding altijd buiten de classe. Deze laad je dan erin:
<?php
class Database
{
private $db;
public function __constructor(PDO $db) // Met PDO ervoor dwingen we een PDO verbinding
{
$this->db = $db;
}
}
$pdo = new PDO('mysql:host=localhost;dbname=test', 'user', 'pass');
$database = new Database($pdo);
?>
Bedankt, dat werkt nu! Maar ben ik nu verplicht om de Database class in te laden binnen het bestand zelf? Of zou ik dit bijvoorbeeld ook in de Core kunnen doen? Maar dan wil ik wel de inhoud van $pdo in de class.Database.php laten staan.
<?php
class Database extends PDO
{
public $dbConnect;
public function __construct(PDO $dbConnect)
{
$IniFile = parse_ini_file("../config.ini");
try
{
if ($IniFile == true)
{
$Database["Hostname"] = $IniFile["Hostname"];
$Database["Username"] = $IniFile["Username"];
$Database["Password"] = $IniFile["Password"];
$Database["Dataname"] = $IniFile["Dataname"];
}
else
{
throw new Exception ("Unable to load ini file");
}
}
catch (Exception $e)
{
new ExceptionHandler($e);
}
$this->dbConnect = $dbConnect;
$this->dbConnect->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
if ($this->dbConnect->getAttribute(PDO::ATTR_DRIVER_NAME))
{
$this->dbConnect->setAttribute(PDO::ATTR_EMULATE_PREPARES, true);
$this->dbConnect->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, true);
}
}
}
global $Database;
$PDO = new PDO('mysql:host=' . $Database["Hostname"] . ';dbname=' . $Database["Dataname"], $Database["Username"], $Database["Password"]);
$oDatabase = new Database($PDO);
?>
Maar nu wil hij helemaal geen verbinding meer leggen met de database. Ik heb het idee dat hij niet eens de constructor van de Database klasse uitvoert.
Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[28000] [1045] Access denied for user 'apache'@'localhost' (using password: NO)'
Maar dit klopt niet. Je moet eerst de constructor van Database hebben gehad voordat je die $database variabelen weet. Maar om de constructor van Database aan te roepen moet je hem een instantie van PDO meegeven. En om die instantie te kunnen maken zodat je hem kan meegeven heb je die $database variabelen nodig.