OOП PHP в примери Част 2 - Връзка с базата данни
Пример 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 - Странициране






/ Трябва да сте регистриран за да напишете коментар /
От: sekul79
20:25 29-11-2009
Браво страхотен урок подробно обяснено идеално,повечето уроци ги прават сякаш да не разбере нищо човек...
Благодаря за времето и желанието ти
От: sekul79
11:15 30-11-2009
Браво страхотен урок подробно обяснено идеално,повечето уроци ги прават сякаш да не разбере нищо човек...
Благодаря за времето и желанието ти
1