PDO en PHP
Ik wil met PHP één PDO verbinding maken. Dat wil niet geheel lukken omdat ik de volgende error krijg:
Quote:
Warning: PDO::prepare() [pdo.prepare]: SQLSTATE[00000]: No error: PDO constructor was not called in 'class.Core.php' on line 9
Gewijzigd op 30/06/2011 17:20:36 door PHP Scripter
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:
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.
Gewijzigd op 30/06/2011 17:20:59 door PHP Scripter
Dit is momenteel mijn database klasse:
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.
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
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
<?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);
?>
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.
Code (php)
1
Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[28000] [1045] Access denied for user 'apache'@'localhost' (using password: NO)'
Gewijzigd op 30/06/2011 17:36:36 door PHP Scripter
Je class Database extend PDO. Dat hoeft niet.
Jelmer, iemand anders vertelde mij dat dat juist wel moet. Ofja, dat het eigenlijk niet zoveel uitmaakt.
Maar je kan zo 1 2 3 ook niet achterhalen waarom ik mijn $Database variablen niet buiten die function kan krijgen?
Maar je kan zo 1 2 3 ook niet achterhalen waarom ik mijn $Database variablen niet buiten die function kan krijgen?
Dat komt door de scope van die variabelen. Ze bestaan alleen binnen de functie.
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.
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.
Jelmer, bedankt! De volgorde klopte inderdaad niet. Nu laat ik de gegevens voor $Database in in de Core en laat daarna pas de Database klasse.
Gewijzigd op 01/07/2011 21:37:51 door PHP Scripter
Spamkickslotje



