I'm an absolute beginner in PHP OOP in search of the "Holy Grail" of connecting to MySQL database once and reusing this connection for the whole site.
classes/db.php
<?php define('SERVER', 'localhost'); define('USERNAME', 'root'); define('PASSWORD', 'password'); define('DATABASE', 'cms'); class DB { function __construct(){ $connection = @mysql_connect(SERVER, USERNAME, PASSWORD) or die('Connection error -> ' . mysql_error()); mysql_select_db(DATABASE, $connection) or die('Database error -> ' . mysql_error()); } } ?>
classes/users.php
<?php class Users { function __construct(){ $db = new DB(); } public function read(){ $query = mysql_query("select use_id, use_name, use_email FROM users"); while ($row = mysql_fetch_array($query)){ $data[] = $row; } return $data; } } ?>
users.php
<?php require_once('classes/db.php'); ?> <?php require_once('classes/users.php'); ?> <?php $Users = new Users(); $users = $Users->read(); ?> <?php if ($users) { echo '<ul>'; foreach($users as $user){ echo '<li><a href="mailto:' . $user['use_email'] . '">' . $user['use_name'] . '</a></li>'; } echo '</ul>'; } ?>
My doubts are mostly on the Users
class part:
function __construct(){ $db = new DB(); }
It seems to be an easy way to have the connection available, but I read somewhere that instantiate the db connection in the constructor is a bad idea. Can you explain why, and if there's a better way to have the db connection easily available in every class that needs it?
I read a similar question here, but I can't understand the abstraction/holding reference/singleton suggestion from the accepted answer, and the lack of a full practical example doesn't help me.