Punta de Choros

27 декември 2009

На 2009г й оставаха 120ч съществуване. От календара падна поредния лист с дата 27 декември и към 10.30ч сутринта ме събуди звън от телефона.

Инсталация на Microsoft шрифтове в Ubuntu 16.04

14 януари 2017

нсталация на Microsoft шрифтове в Ubuntu се поражда от идеята браузърите в различните системи, да показват еднакво текстовото съдържанието на интернет страниците.

Ubuntu 16.04 инсталация на USB disk on Key

19 ноември 2016

Арсеналът ми от мобилни компютри съдържа Fujitsu Lifebook AH530. Това е бюджетна машина от 2011г на Intel Core i5-480M процесор и 4GB DDR3 RAM памет.

gparted

Paragon ExtFS for Windows

30 юли 2016

ExtFS for Windows е утилита на Paragon Software разработена през 2013г. Тя представлява решение, предоставящо пълен достъп на четене и на запис до раздели ...

msvcr100.dll is missing Windows 10

04 октомври 2016

Майк Патерсън от Plixer, компания по компютърната сигурност, публикува доклад , че Windows 10 изпраща данни в криптиран вид от вашата машина на всеки пет минути. Той е направил максимума, за да спре изтичането, но системата продължавала да изпраща информация.


PHP е уеб-програмен език. Неговата сила е създаване на динамични сайтове в тясно взаимодействие с сървър за база данни. Рано или късно развитието на програмиста или разрастването на сайта опира до ООП (обектно-ориентирано програмиране). За прохождащите PHP програмисти ООП звучи плашещо, забит с сложен синтаксис концепция по пътя към овладяването му.

Преди всичко е необходимо разучаване и съответно разбиране. Класът не е самоцел, ни комплект от функции (методи на класа) или удобен контейнер за променливи (свойства на класа), а абстрактен тип от данни, призвани да взаимодействат с подобни от други класове (разбирай обекти).


Чайковски - Ромео и Жулиета

Какво на практика е ООП, какво е обект, клас, метод, свойство и т.н. е извън рамката на тази тема. Просто начало към тази материя и след като бе упоменато база данни веднъж на там ще акцентира класа.

Според конвенцията за именуване на класове му дадох следното име
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)


Ползването на клас не превръща автоматично кода в обектно ориентиран. Не, в този вид той е обектно-процедурен. Появата на пореден обект и взаимодействие между тях, но това с времето си.





до нови срещи   ^.^

24.12.2011 profruit 

1 Response to "Моят първи PHP клас"

  1. fedora Said,

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

    Поздрави :)

     

Публикуване на коментар

Този блог е реинкарнация на първите ми опити за споделяне в нета. На времето започнах с къси разкази на преживяното. После се обезсмисли и превърнах блога си в системно радио. Пиша единствено неща, които карат душата ми да живее: Ubuntu, WEB, Photoshop, Фотография, Споделено и т.н. Това е моето системно радио, разбирате ли? Моята вълна и вие сте на нея сега.

Архив на блога