Преди всичко е необходимо разучаване и съответно разбиране. Класът не е самоцел, ни комплект от функции (методи на класа) или удобен контейнер за променливи (свойства на класа), а абстрактен тип от данни, призвани да взаимодействат с подобни от други класове (разбирай обекти).
Какво на практика е ООП, какво е обект, клас, метод, свойство и т.н. е извън рамката на тази тема. Просто начало към тази материя и след като бе упоменато база данни веднъж на там ще акцентира класа.
Според конвенцията за именуване на класове му дадох следното име
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)
Ползването на клас не превръща автоматично кода в обектно ориентиран. Не, в този вид той е обектно-процедурен. Появата на пореден обект и взаимодействие между тях, но това с времето си.
до нови срещи ^.^
Весела Коледа!
Здраве и догодина да си с втори клас ;)))
Поздрави :)