Преди всичко е необходимо разучаване и съответно разбиране. Класът не е самоцел, ни комплект от функции (методи на класа) или удобен контейнер за променливи (свойства на класа), а абстрактен тип от данни, призвани да взаимодействат с подобни от други класове (разбирай обекти).
Какво на практика е ООП, какво е обект, клас, метод, свойство и т.н. е извън рамката на тази тема. Просто начало към тази материя и след като бе упоменато база данни веднъж на там ще акцентира класа.
Според конвенцията за именуване на класове му дадох следното име
database.class.php.
<?php
class MySQLDatabase{
private $db_host = 'localhost';
private $db_user = 'root_name';
private $db_pass = 'password';
private $db_name = 'base_name';
private $connection;
public $last_query;
public function __construct() {
$this->open_connection();
}
private function open_connection()
{
$this->connection = mysql_connect($this->db_host, $this->db_user, $this->db_pass);
if(!$this->connection)
{
die ('No server connected: '.mysql_error());
}
else
{
$db_select = mysql_select_db($this->db_name, $this->connection);
if(!$db_select)
{
die('No Data Base selected : '.mysql_error());
}
}
}
public function close_connection()
{
if (isset($this->connection))
{
mysql_close($this->connection);
unset($this->connection);
}
}
public function query($sql)
{
$this->last_query = $sql;
$result = mysql_query($sql, $this->connection);
$this->confirm_query($result);
mysql_query('SET NAMES utf8');
return $result;
}
private function confirm_query($result)
{
if(!$result)
{
die('DataBase query failed: '.mysql_error());
}
}
}
$database = new MySQLDatabase();
Името на класа е MySQLDatabase. Това намеква обръщение към MySQL сървър. Следва поредица от закрити свойства (private). Тяхното съдържание подсказва име на хоста, потребител на база данни, парола, име на база данни.
Следва закритo свойство $connection. То ще съдържа върнатия резултат от метод mysql_connect и ще се явява идентификатор на връзката.
Свойство $last_query е за служебни цели по време на разработка на сайта.
Какво следва? Методите и първият от тях е магически. Това е конструктора. Ясно, че при създаване на обект на класа (ред 60), PHP инициализира конструктор. Конструкторът вика метод open_connection(), а това поражда връзка с MySQL сървъра. Следва обичайни проверки и ако няма връзка плюем съобщение "Бла бла, няма никой". Пак за лично удобство по време на разработката четем грешките.
Логично избираме база данни в ред 24. В ред 32 принудително затваряме връзката с MySQL сървър. Макар PHP да се грижи за това, искам сам да вържа козата, да не ми ошмули сливата.
Нещо, което винаги ще се повтаря е изпълнение на поредна заявка.За целта добавяме пореден метод function query(). И пак за лична осведоменост по време на разработка ще запомняме последната заявка в свойство $last_query.
Това е всичко. Там където е нужно съединение с БД пишем инстанцията и се обръщаме към нужния метод.
В тема назад "PHP Login Форма с Запомни ме" ви запознах как се логва потребител в закрита зона на сайт. Ползването на този клас веднага обезсмисля файл db.php, а файл chekpoint.php придобива следното изменение. Следете коментираните редове. Те са заменени от нови поради ползване на класа.
<?php
if(!defined('CHECK_POINT'))
{
header('Location: index.php');
exit;
}
else
{
session_start();
if($_SESSION['loggedin']===true)
{
header('Location: dashboard.php');
exit;
}
else if(isset($_COOKIE['prologin']))
{
$token = addslashes($_COOKIE['prologin']);
//require_once 'db.php'; //връзка с БД
require_once 'database.class.php';
$sql = 'SELECT `login` FROM `users` WHERE `token` ="'.$token.'"';
//$res = mysql_query($sql, $id); //изпълняваме заявката
$res = $database->query($sql);
if(mysql_num_rows($res)==1)
{
$token = md5(time());
$row = mysql_fetch_assoc($res);
$_SESSION['loggedin'] = true;
$_SESSION['user_info'] = $row;
unset($_COOKIE['prologin']);
setcookie("prologin", $token, time()+60*60*24*7);
//mysql_query('UPDATE `base_name`.`users` SET `token`= "'.$token.'" WHERE login="'.$row['login'].'"', $id);
$sql = 'UPDATE `base_name`.`users` SET `token`= "'.$token.'" WHERE login="'.$row['login'].'"';
$database->query($sql);
//close_connection();
$database->close_connection();
header('Location: dashboard.php');
exit;
}
else if(mysql_num_rows($res)==0)
{
setcookie("prologin", null, time()-3600);
header('Location: index.php');
exit();
}
}
else
{
$_SESSION['rand'] = rand(0, 9999);// id на формата
$key = md5($_SERVER['REMOTE_ADDR'].$_SERVER['HTTP_HOST'].$_SERVER['HTTP_USER_AGENT'].$_SESSION['rand']);
}
}
Наблюдателните веднага ще кажат, че аналогично mysql_num_rows() може да се причисли към класа като пореден метод. Да и те са прави, а това ще изглежда по този начин.
public function num_rows($res) {
return mysql_num_rows($res);
}
А файл chekpoint.php в ред 27 ще претърпи следното изменение:
if( $database->num_rows($res)==1)
Ползването на клас не превръща автоматично кода в обектно ориентиран. Не, в този вид той е обектно-процедурен. Появата на пореден обект и взаимодействие между тях, но това с времето си.
до нови срещи ^.^

Весела Коледа!
Здраве и догодина да си с втори клас ;)))
Поздрави :)