Goedendag,

Ik hoop dat iemand mij kan helpen in het connecten met mijn database volgens PDO.
Ik wil graag in mijn template een PDO verbinding maken om zo data op te roepen en direct te kunnen verwerken in mijn template.
Dit werkt 100% zonder problemen op de oude Mysql_query manier, echter bij PDO gaat het mis.
Hier krijg ik constant de foutmelding:
Fatal error: Call to a member function query() on a non-object in layout.php on line 88..
(de PDO aanroep van de naam uit de tabel gebruikers

Dezelfde aanroep kan ik wel uitvoeren in de index.php zonder probleem en vervolgens het resultaat aanroepen in de layout.php
Echter wil ik graag net zoals het werkte met mysql_query graag in de layout.php ook de pdo connectie kunnen aanroepen en ook daar dingen uit de database kunnen halen.

Hieronder heb ik uitgewerkt hoe ik de connecties heb liggen tussen mijn database, config bestand, template bestand en index.php

Ik hoop dat iemand me kan helpen / in de juiste richting kan sturen hoe ik alsnog via PDO een verbinding kan aanroepen vanuit de layout.php (mijn template bestand).

Ik heb uiteraard eerst gezocht op het internet, daarbij veel bronnen tegengekomen over PDO en diens connectie wijze. Een eigen query functie getracht te maken, echter liep alles constant op het zelfde uit de foutmelding zoals hierboven.
Fatal error: Call to a member function query() on a non-object in layout.php on line 88..




/* Database connectie */
database.php

/* PDO Database connectie */
$dbv = array (
    'host' => 'host',
    'dbname' => 'dbnaam',
    'user' => 'gebruikersnaam',
    'pass' => 'wachtwoord'
);

try
{
  $db = new PDO('mysql:host='.$dbv['host'].';dbname='.$dbv['dbname'], $dbv['user'], $dbv['pass']);
  $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}
catch(PDOException $e)
{
    $sMsg = '<p>
            Regelnummer: '.$e->getLine().'<br />
            Bestand: '.$e->getFile().'<br />
            Foutmelding: '.$e->getMessage().'
        </p>';
    
    trigger_error($sMsg);
		file_put_contents('PDOErrors.txt', $sMsg, FILE_APPEND); 
		die();
} 

/* Einde database connectie */


/* Mijn config bestand */
config.php

/* Database connectie aanroepen */
include_once('database.php');
/* Mijn template */
require_once ('layout.php');

/* Einde config bestand */


/* Mijn index bestand */
index.php

session_start();
/* config aanroepen waar ook de database connectie in aangeroepen wordt */
require_once('config.php');
/* Mijn template aanroepen voor de grafische schil */
$l = new Layout(); 

/* Hier een PDO connectie aanroepen gaat zonder problemen */
/* Hier heb ik al geprobeerd data door te zetten op dezelfde wijze als b.v. content hieronder, dat werkt. Echter wil ik graag de data rechtstreeks in de template kunnen aanroepen en ophalen via een PDO connectie */

/* Mijn output die ik weer aanroep in de template*/
$l->content = 'tekst e.d. hier';
$l->contentheight = '375px';
$l->display();



/* Mijn template */
layout.php

class Layout  {	
	var $this;
	var $content;
	var $contentheight;

	function display() 
	{
		$doctype = '';
		$head ='';
		$body =''

		/* Hier wil een PDO connectie aanroepen */
		$sql = "SELECT naam FROM gebruiker WHERE id = '1'";
		$result = $db->query($sql);
		$rijen = $result>fetchAll(PDO::FETCH_ASSOC);
		foreach ($rijen as $rij) {
			$body .='gebruikersnaam: '.$rij['naam'].'<br />';
		}
		$main = $doctype.$head.$head;
		return $main;
	}
}


/* Einde template */
De methoden kennen $db niet.

Het verschil met de mysql_-functies is dat deze altijd uitgingen van de laatst gemaakte connectie, het was in dat geval dan ook niet verplicht een databaseverbinding-parameter/object/resource door te geven.

(een) Oplossing: geef $db mee als argument bij creatie van een template-object. Of werk via modellen ofzo. Als je toch al een soort van MVC-opzet hebt is het niet echt gebruikelijk om code te gaan kloppen (laat staan queries uit te gaan voeren) binnen in een template?
Hoi Thomas, Dank voor je reactie. Ik begrijp dat het niet gebruikelijk is, echter voor nu zou het mijn leven even een heel stuk gemakkelijker maken :)

Reageren