PDO en PHP

Overzicht

Sponsored by: Vacatures door Monsterboard

PHP Scripter

PHP Scripter

29/06/2011 16:02:06
Anchor link
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


Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
Code is niet meer relevant.
Gewijzigd op 30/06/2011 17:20:36 door PHP Scripter
 
PHP hulp

PHP hulp

28/03/2024 23:11:36
 
Wouter J

Wouter J

29/06/2011 16:17:47
Anchor link
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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
<?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);
?>
 
PHP Scripter

PHP Scripter

29/06/2011 17:08:48
Anchor link
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
 
PHP Scripter

PHP Scripter

30/06/2011 17:18:47
Anchor link
Dit is momenteel mijn database klasse:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?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.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
 
Jelmer -

Jelmer -

30/06/2011 20:29:32
Anchor link
Je class Database extend PDO. Dat hoeft niet.
 
PHP Scripter

PHP Scripter

01/07/2011 12:16:19
Anchor link
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?
 
Jelmer -

Jelmer -

01/07/2011 15:24:58
Anchor link
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.
 
PHP Scripter

PHP Scripter

01/07/2011 21:37:18
Anchor link
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
 
- Ariën  -
Beheerder

- Ariën -

26/06/2019 17:56:45
Anchor link
Spamkickslotje
 
 

Dit topic is gesloten.



Overzicht

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.