Profruit banner

Умен звънец в openHAB

16 декември 2023

Телефонът е винаги с мен и сега, където и да се намирам получавам известие от openHAB, че някой е позвънил и чака пред вратата. А ако ме няма вкъщи става ясно часа и датата на последното позвъняване.

Tasmota Multipress

30 септември 2023

Идеята е Sonoff Touch T1 US 2 в салона, да управлява освен своето осветление и това в кухнята, а още вентилатора.

DIY 12V 1A WiFi Router UPS

22 април 2023

При поредно прекъсване на захранването вкъщи, батерията на нoтбука и двата UPS автоматично превключват на аварийно захранване и едновременно полита съобщение за конфуза

Zigbee2MQTT клониране

21 януари 2023

... как да клонираме съществуваща настройка на Zigbee2MQTT без да се налага последвало интервю на zigbee-устройствата.

LD2410 - бюджетен датчик присъствие в openHAB

11 февруари 2023

Цената на HLK-LD2410 зададе име на поредната тема в моя блог. С негова помощ се постига "народен" датчик присъствие в домашната автоматизация. . ...


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,

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

    Поздрави :)

     

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

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

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