Ik heb een connectie class die prima werkt, nu wil een beetje OOP gaan leren en een menu script bouwen.

Dit is mijn connectie script (connection.php):
<?PHP
session_start();

class Connection {
// Configure Database Vars
private $host = 'localhost';
private $username = 'user';
private $password = 'pass!';
private $db_name = 'dbname';
public $db;

function __construct() {
// Create connection
$db = new mysqli($this->host, $this->username, $this->password, $this->db_name);
// Check connection
if ($db->connect_errno > 0) {
die('Unable to connect to the database: '.$db->connect_error);
}
$this->db = $db;
}

public function query($query) {
$db = $this->db;
$this->db->query('SET NAMES utf8');
if (!$result = $this->db->query($query)) {
die('There was an error running the query ['.$db->error.']');
} else {
return $result;
}
}

public function multi_query($query) {
$db = $this->db;
if (!$result = $this->db->multi_query($query)) {
die('There was an error running the multi query ['.$db->error.']');
} else {
return $result;
}
}

public function real_escape_string($value) {
return $this->db->real_escape_string($value);
}

public function inserted_id() {
return $this->db->insert_id;
}
}

$conn = new Connection;
?>

En dit is mijn poging tot een menu script (menuClass.php):

<?php
require_once('includes/connection.php');
class Menu extends Connection
{
public function selectCats()
{
$cats = "SELECT * FROM snm_categories WHERE published = '1'";
$catscon = $this->db->query($cats);
return $cats;
}
}
?>

Dit geeft geen errors, alleen ik hoorde van iemand dat het slecht is om de connectie class te extenden omdat een menu iets heel anders is dan een connectie.

Mijn vraag is dus, hoe kan ik de functie query() gebruiken binnen mijn menu class?

Ik heb het volgende al geprobeerd:

<?php
require_once('includes/connection.php');
$menucon = new Connection;
class Menu
{
public function selectCats()
{
$cats = "SELECT * FROM snm_categories WHERE published = '1'";
$catscon = $menucon->db->query($cats);
return $cats;
}
}
?>

Maar dit geeft een fatal error: Call to a member function query() on null

Wat doe ik fout?
Dan was het toch persistente connecties waarschijnlijk. Maar meerdere connecties kun je voorkomen door op één vaste plek een connectie te maken, en vervolgens het object door te geven als parameter (dependency injection).

Als je nooit een tweede connectie op eenzelfde database nodig hebt (dit kan soms wel handig zijn) dan zou je het Singleton pattern kunnen gebruiken. Maar anders zet je jezelf buiten spel door gebruikmaking hiervan.
Ik heb de testopzet nog even uitgebreid. Dit geeft inderdaad drie aparte connecties met een continu oplopende ID:


<?php
$dbh_one = new \PDO('mysql:dbname=test;host=127.0.0.1', 'root', '');
$dbh_two = new \PDO('mysql:dbname=test;host=127.0.0.1', 'root', '');
$dbh_tri = new \PDO('mysql:dbname=test;host=127.0.0.1', 'root', '');

$stmt_one = $dbh_one->prepare('SELECT CONNECTION_ID()');
$stmt_two = $dbh_two->prepare('SELECT CONNECTION_ID()');
$stmt_tri = $dbh_tri->prepare('SELECT CONNECTION_ID()');

$stmt_one->execute(); 
$stmt_two->execute(); 
$stmt_tri->execute(); 

$row_one = $stmt_one->fetch();
$row_two = $stmt_two->fetch();
$row_tri = $stmt_tri->fetch();

echo '<pre>';
var_dump($row_one, $row_two, $row_tri);
?>
Topic onnodig gekicked vanwege (inmiddels verwijderde) spam. Daarom gesloten. Topicstarter kan eventueel verzoek tot heropening indienen.

Reageren