Webmaster общности: Predpriemach.com | SearchEngines.bg

    OOП PHP в примери Част 2 – Връзка с базата данни

    Автор: lortnoc

    Пример 2:

    Прочетете теорията какво е клас и има ли почва у нас!

    Работи с >= PHP 5. За по-ниски версии трябва премaхнете отвсякъде public и private. Като когато се инициализират член променливите където са private -> трябва да ги заместите с var -> примерно: var $_host;

    Ще опиша как се прави клас за връзка с базата данни, обяснения.
    Дефинираме си константи с информация за потребителя и базата.

    define("DB_HOST", ""); //хост адрес на базата данни
    define("DB_USER", ""); //име на потребителя
    define("DB_PASS", ""); //парола на потребителя
    define("DB_DATA", ""); //име на базата

    Започваме работата с класа. Декларираме класа:

    class dbStruct {
    
    }

    Декларираме член променливите за класа:

    private $_host; //това ще съхранява хост името където се намира базата
    private $_user; //това ще съхранява потребителското име
    private $_pass; //това ще съхранява паролата потребителското име
    private $_data; //това ще съхранява името на базата
    private $_link; //това ще съхранява индификатора на кънекцията от mysql_connect();
    private $_resource; //това ще съхранява ресурсът върнат от mysql_query();
    private $_array; //това ще съхранява масива извлечен чрез mysql_fetch_assoc();
    private $_numArray; //това ще съхранява броя на записите върнати от mysql_fetch_assoc();
    private $_numQueries; //това съм го сложил да отразява колко заявки сме направили

    Дефинираме конструктора, който ще присвои стойности на членовете:
    Помните $this, служи за достъп до променливите и методите на класа.

    public function __construct() {
    $this->_host = DB_HOST; //на $_host присвояваме стойността на константата DB_HOST
    $this->_user = DB_USER; //на $_user присвояваме стойността на константата DB_USER
    $this->_pass = DB_PASS; //на $_pass присвояваме стойността на константата DB_PASS
    $this->_data = DB_DATA; //на $_data присвояваме стойността на константата DB_DATA
    $this->_link = 0; //нямаме връзка
    $this->_numQueries = 0; //нямаме заявки
    $this->_resource = false; //нямаме ресурс
    $this->dbConnect(); //викаме метода dbConnect(); който прави връзката
    $this->dbSelectdb(); //викаме метода dbSelectdb(); който избира базата
    }

    Да видим метода dbConnect():
    С mysql_connect() се опитваме да се свържем с хоста с вече запълнените променливи от конструктора.
    Ако е успешно ще върне индификатор, ако не ще спре изпълнението на скрипта и ще се извика метода dbError();
    който метод просто отпечатва грешката и номера на грешката.

    private function dbConnect() {
    $this->_link = mysql_connect($this->_host, $this->_user, $this->_pass) or die($this->dbError());
    }

    Метода dbSelectdb() е следния:
    Вече с установения индификатор, чрез mysql_select_db() избираме базата, чието име е със стойност такава каквато я направи конструктора.
    Ако не избере базата, спира скрипта и се вика пак метода dbError();

    private function dbSelectdb() {
    mysql_select_db($this->_data, $this->_link) or die($this->dbError());
    }

    Ето го и батко бе:
    Просто и ясно номера на грешката mysql_errno() и текста на грешката mysql_error()

    private function dbError() {
    return mysql_errno() . ". " . mysql_error();
    }

    Следва метода, който прави заявки. По подадената заявка като параметър, се изпълнява
    mysql_query();, като вторият параметър е индификатора на връзката (не е задължителен).
    В началото на метода, ако имаме ресурс го нулираме, и се пробваме да направим заявка. Ако не стане
    знаете dbError(); Ако е успрешна отбелязваме, че сме направили една заявка и присвояваме ресурса
    върнат от mysql_query(); на $_resource;

    public function dbQuery($sql) {
    $this->_resource = false;
    $this->_resource = mysql_query($sql, $this->_link) or die($this->dbError());
    $this->_numQueries++;
    }

    Трябва ни фукнция която извлича данните от базата:

    public function dbArray($sql, $first = false) {
    $this->_array = array();
    $this->_numArray = 0;
    $this->dbQuery($sql);
    
    if($this->_resource) {
    if($first) {
    $row = mysql_fetch_assoc($this->_resource);
    $this->_array = $row;
    $this->_numArray++;
    } else {
    while ($row = mysql_fetch_assoc($this->_resource)) {
    $this->_array[] = $row;
    $this->_numArray++;
    }
    }
    }
    return $this->_array;
    }

    Приема два параметъра – заявка и индификатор дали искаме да върне 1 резултат или много.
    Продължаваме надолу:
    Където ще съхраняваме масива $_array го нулираме.
    Нулираме и броя на елементите в този масив.
    Правим заявка като извикаме метода dbQuery(); с подаден параметър първият параметър на текущия метод.
    dbQuery(); си изпълнява работата и връща ресурс съхранен във $_resource;
    Ако имаме ресурс проверяваме дали $first (вторият параметър на метода) е true, ако е true връщаме запис с
    mysql_fetch_assoc(); с подаден параметър ресурсът $_resource;
    Присвояваме записа в масива $_array; и увеличаваме с 1 променливата която съдържа броя на елементите на $_array;
    Ако $first е false (което е по подразбиране) започваме да извличаме записите 1 по 1 и ги слагаме в масива $_array
    като увеличаваме и променливата $_numArray всеки път с 1.
    Когато всичко приключи връщаме генерирания масив.

    Метода getNumArray() ни позволява да вземем броя на елементите на този масив.

    public function getNumArray() {
    return $this->_numArray;
    }

    Ами това е сега да го пробваме 🙂 АААА преди това спомняте ли си предходния урок от тая поредица ->
    за страницирането. Ами да го използваме тука да пробваме 🙂
    include класът за странициране.
    Include класът за връзка с базата.

    include("paging.class.php");
    include("dbstruct.class.php");
    
    $db = new dbStruct(); //създаваме обект от нашия клас. Вика се конструктора. Той се свързва с базата и т.н (знаем какво прави).
    //викаме метода dbArray() през обекта с заявка SELECT COUNT(*) as num FROM players и вотри параметър true, искаме да върне един запис.
    $count = $db->dbArray("SELECT COUNT(*) as num FROM players", true);
    //ще върна броя на записите във таблицата в случая players
    
    //помните ли променливите на paging класа.
    $perpage = 2; //по колко на страница
    $total = $count['num']; //общ брой (това е от заявката)
    $current = $_GET['page']; //текущата страница
    
    //създаваме обект от клас paging
    $paging = new paging($total, $perpage, $current);
    //строим логиката
    $paging->createLinks();
    
    //правим нова заявка SELECT * FROM players LIMIT {$paging->_offset},{$perpage} - изведи всички players
    като ги лимитираш с отместване $paging->_offset до $perpage на страница. Не подаваме втори параметър на dbArray()
    защото искаме да вземем много записи (по подразбиране е false). Ако всичко е наред ще се върне масив с записи и ще се съхрани във $players;
    $players = $db->dbArray("SELECT * FROM players LIMIT {$paging->_offset},{$perpage}");
    
    //Правим проста таблица
    
    echo '<table border="1" width="300">';
    //обхождаме масива и принтираме данните :)
    foreach ($players as $player) {
    echo '<tr>';
    echo '<td>';
    echo $player['player_id'];
    echo '</td>';
    echo '<td>';
    echo $player['player_hero_name'];
    echo '</td>';
    echo '</tr>';
    }
    echo '</table>';
    echo '<br>';
    
    //принтираме линковете
    $paging->printLinks();

    И сега без коментарите -> лесно, бързо и екологично чисто 🙂

    include("paging.class.php");
    include("dbstruct.class.php");
    
    $db = new dbStruct();
    $count = $db->dbArray("SELECT COUNT(*) as num FROM players", true);
    
    $perpage = 2;
    $total = $count['num'];
    $current = $_GET['page'];
    
    $paging = new paging($total, $perpage, $current);
    $paging->createLinks();
    
    $players = $db->dbArray("SELECT * FROM players LIMIT {$paging->_offset},{$perpage}");
    
    foreach ($players as $player) {
    echo $player['player_hero_name'] . '<br>';
    }
    
    $paging->printLinks();

    Ми това е 🙂 За домашна искам да си напишете методи за insert и update -> с защити 🙂

    Очаквайте: В следващия урок, ще ви покажа как да си направим клас който да обслужва дърво от категории. Т.е една категория може да е подкатегория на друга, която е подкатегория на трета и така до N 🙂 . Ще ги свържем с предходните два урока.

    Връзки с другите части:

    OOП PHP в примери Част 1 – Странициране

    Оставете коментар