Слайд 1
Въведение в PHP
Работа с бази данни
Слайд 2
База данни за проста анкета 1/2
Създаване на база данни playground
CREATE DATABASE playground CHARSET utf8
Добавяне на таблица poll
CREATE TABLE poll (
poll_id INT NOT NULL AUTO_INCREMENT,
poll_question TEXT,
yes INT DEFAULT 0,
no INT DEFAULT 0,
PRIMARY KEY (poll_id)
)
Добавяне на запис
INSERT INTO poll ( poll_question) VALUES
("Приятно ли е да изучавате PHP?")
Промяна на значение на поле
UPDATE poll SET yes = yes + 1 WHERE poll_id = 1
Слайд 3
База данни за проста анкета 2/2
Слайд 4
Организация на кода 1/2
Шаблон за проектиране model-view-controller (MVC) http://en.wikipedia.org/wiki/Model-view-controller
Разделя кода в три категории: модели, изгледи и контролери
Моделът е частта от кода, представяща данните.Включва основната логика на решаваната задача
Изгледът е частта от кода, която представя информацията визуално. Представяните данни се получават от модела
Контролерът е частта от кода, която получава входни данни от потребителя и изпраща команди на съответния модел(и).
MVC разделя входа от потребителя, визуалното представяне, данните и логиката на задачата
Фронт-контролерът е входната врата на приложението – за php скриптовете това е файлът index.php, който се зарежда директно в браузера
Слайд 5
Организация на кода 2/2
Слайд 6
Създаване на проект-анкета: вариант 1
<?php
// models/Page_Data.class.php
class Page_Data {
public $title = "";
public $content = "";
public $css = "";
public $embeddedStyle = "";
public function addCSS( $href ){ $this->css .= "<link href='$href' rel='stylesheet' />";
}
}
<?php
// views/page.php
return "<!DOCTYPE html>
<html> <head>
<title>$pageData->title</title>
<meta content='text/html;charset=utf-8' />
$pageData->css
$pageData->embeddedStyle
</head>
<body>
$pageData->content
</body></html>"; ?>
<?php // index.php
include_once "models/Page_Data.class.php"; //Зареждаме модела
$pageData = new Page_Data();
$pageData->title = "PHP/MySQL примерна анкета";
$pageData->content .= "<h1>Засега всичко работи!</h1>";
$page = include_once "views/page.php"; //изглед на страницата (данни+шаблон)
echo $page; //извеждане на генерираната страница
Слайд 7
Създаване на проект-анкета: вариант 1 демо
фронт-контролерът index.php свързва модела и изгледа
страницата е комбинация от изгледа (page.php), обединен с модела (Page_Data.class.php)
Слайд 8
Контролер на анкетата: тестов вариант
Създаваме скелета на контролера на анкетата poll.php
<?php
//controllers/poll.php
return "Анкетата ще бъде показана тук! ";
Зареждаме контролера в index.php след създаването на обекта $pageData и преди включването на шаблона на страницата
<?php // poll2/index.php
error_reporting( E_ALL );
ini_set( "display_errors", 1 );
include_once "models/Page_Data.class.php";
$pageData = new Page_Data();
$pageData->title = "PHP/MySQL примерна анкета";
// $pageData->content .= "<h1>Засега всичко работи!</h1>";
$pageData->content = include_once "controllers/poll.php";
$page = include_once "views/page.php";
echo $page;
Слайд 9
Контролер на анкетата: вариант 1 демо
Слайд 10
Модел, изглед и контролер на анкетата вар.1
<?php
// models/Poll.class.php
class Poll {
public function getPollData() {
$pollData = new stdClass();
$pollData->poll_question = "тестване...";
$pollData->yes = 0;
$pollData->no = 0;
return $pollData;
}
}
<?php
//views/poll-html.php
return
"<aside id='poll'>
<h1>Резултати от анкетата</h1>
<ul>
<li>$pollData->yes отговарят ДА</li>
<li>$pollData->no отговарят НЕ</li>
</ul>
</aside>
";
<?php
// controllers/poll.php
include_once "models/Poll.class.php";
$poll = new Poll();
$pollData = $poll->getPollData();
$pollView = include_once "views/poll-html.php";
return $pollView;
Слайд 11
Модел, изглед и контролер на анкетата вар.1 демо
MVC капсулира изгледите от моделите и от контролерите
Може да изменяме изгледа без да променяме нищо друго ( например, заменяме <ul> с друг елемент)
Аналогично, можем да сменим съдържанието с малък фрагмент код models/Poll.class.php.
Приложението е изградено от самостоятелни, слабо обвързани елементи
Зависимост: в views/poll-html.php, е нужен обект $pollData със свойства have yes и no
Във views/poll.php, трябва да създадем този обект, в противен случай анкетата няма да работи
Слайд 12
Свързване с MySQL от PHP 1/3
PHP предлага 3 различни API за връзка с MySQL, обезпечавани от разширенията mysql, mysqli, и PDO
Пример: Създаване на връзка с MySQL сървъра на страницата "example.com" с потребителско име "user" и парола "password“ и изпълнение на заявка за приветствие на потребителя
Слайд 13
Свързване с MySQL от PHP 2/3
Слайд 14
Свързване с MySQL от PHP 3/3
Препоръчва се да се използват MySQL разширенията mysqli или PDO_
Разширението mysql не следва да се използва за нови приложения, тъй като е маркирано като непрепоръчително (deprecated) в PHP 5.5.0 ще бъде премахнато в бъдеще
Функцията mysql_query е опасна за използване -при грешка може да причини сериозни проблеми
В настоящия пример ще използваме PHP Data Objects (PDO)
Безопасен и ефективен начин за свързвне с бази данни от PHP
PDO поддържа различни бази данни и предлага единен набор от методи за взаимодействие с базите
С PDO, при преминаването от един тип бази данни към друг изисква незначителна промяна в кода
PDO се базира се на обектно-ориентираните възможности на PHP5,
Слайд 15
Отваряне на връзка с базата данни
<?php //poll4/index.php
include_once "models/Page_Data.class.php"; //зареждане на модела
$pageData = new Page_Data();
$pageData->title = "PHP/MySQL пример за анкета на сайт";
//идентификационни данни за базата данни
$dbInfo = "mysql:host=localhost; dbname=playground";
$dbUser = "root";
$dbPassword = "";
try { //опит за създаване на връзка с база данни чрез PDO обект
$db = new PDO( $dbInfo, $dbUser, $dbPassword);
$db->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
$pageData->content = "<h1>Вие сте свързани с базата данни!</h1>";
}catch ( Exception $e ) {
$pageData->content = "<h1>Грешка при свързването!</h1><p>$e</p>";
}
//$pageData->content = include_once "controllers/poll.php";
$page = include_once "views/page.php";
echo $page;
Слайд 16
Отваряне на връзка с базата данни: демо
Слайд 17
Някои методи на класовете PDO и PDOStatement
PDO::setAttribute - задава атрибутите на манипулатора на БД
PDO::ATTR_ERRMODE: Error reporting.
PDO::ERRMODE_EXCEPTION: Throw exceptions
PDO::prepare - подготвя SQL оператор за изпълнение и връща обект PDOStatement
PDOStatement::execute - изпълнява подготвения оператор
PDOStatement::fetchObject – извлича следващия ред от таблицата и го връща като StdClass обект (свойствата на обекта съответстват на имената на колоните на таблицата)
Слайд 18
Обвързване на БД с модела на анкетата 1/3
<?php // models/Poll.class.php
class Poll {
private $db; // ново свойство
//конструктор с параметър свързване с база данни
public function __construct( $dbConnection ){
//съхраняване на полученото свързване с БД в свойството $this->db
$this->db = $dbConnection;
}
public function getPollData() {
$sql = "SELECT poll_question, yes, no FROM poll WHERE poll_id = 1"; // SQL оператор
//използване на PDO връзката за създаване на обект PDOStatement
$statement = $this->db->prepare($sql);
$statement->execute(); //изпълнение на оператора от MySQL
$pollData = $statement->fetchObject(); //извличане на 1-я ред данни от таблицата
return $pollData; //връщаме данните от анкетата на повикващия метод
}
}
Слайд 19
Обвързване на БД с модела на анкетата 2/3
<?php
// controllers/poll.php
include_once "models/Poll.class.php";
$poll = new Poll($db);
$pollData = $poll->getPollData();
$pollView = include_once "views/poll-html.php";
return $pollView;
<?php
//views/poll-html.php
return "
<aside id='poll'>
<h1>Резултати от анкетата</h1>
<ul>
<li>$pollData->yes отговарят ДА</li>
<li>$pollData->no отговарят НЕ</li>
</ul>
</aside>
";
Слайд 20
Обвързване на БД с модела на анкетата 3/3
<?php
…
include_once "models/Page_Data.class.php";
$pageData = new Page_Data();
$pageData->title = "PHP/MySQL пример за анкета на сайт";
$dbInfo = "mysql:host=localhost;dbname=playground";
$dbUser = "root";
$dbPassword = "";
try {
$db = new PDO( $dbInfo, $dbUser, $dbPassword, array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\'') );
$db->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
$pageData->content = "<h1>Вие сте свързани с БД!</h1>";
}catch ( Exception $e ) {
$pageData->content = "<h1>Грешка при свързването!</h1><p>$e</p>";
}
$pageData->content = include_once "controllers/poll.php";
$page = include_once "views/page.php";
echo $page;
Слайд 21
Възпроизвеждане данните от базата: демо
Слайд 22
Добавяне на форма за гласуване
<?php // views/poll-html.php
$dataFound = isset( $pollData );
if( $dataFound === false ){
trigger_error('views/poll-html.php се нуждае от обект $pollData' );
}
return " <aside id='poll'>
<form method='post' action='index.php'>
<p>$pollData->poll_question</p>
<select name='user-input'>
<option value='yes'>Да, разбира се!</option>
<option value='no'>Не, съвсем не!</option>
</select>
<input type='submit' value= 'Изпрати' />
</form>
<h1>Резултати от анкетата</h1>
<ul>
<li>$pollData->yes отговарят с да</li>
<li>$pollData->no отговарят с не</li>
</ul>
</aside>
";
Слайд 23
Актуализиране на БД след гласуване 1/3
За целта трябва да променим
модела - добавяне на метода за актуализация на базата данни след гласуване в models/Poll.class.php.
контролера на анкетата controllers/poll.php, който отговаря за връзката с потребителя
Слайд 24
Актуализиране на БД след гласуване 1/2
<?php // models/Poll.class.php
class Poll {
private $db;
public function __construct( $dbConnection ){
$this->db = $dbConnection;
}
public function getPollData() {
$sql = "SELECT poll_question, yes, no FROM poll WHERE poll_id = 1";
$statement = $this->db->prepare($sql);
$statement->execute();
$pollData = $statement->fetchObject();
return $pollData;
}
}
public function updatePoll ( $input ) { // нов метод
if ( $input === "yes" ) {
$updateSQL = "UPDATE poll SET yes = yes+1 WHERE poll_id = 1";
} else if ( $input === "no" ) {
$updateSQL = "UPDATE poll SET no = no+1 WHERE poll_id = 1";
}
$updateStatement = $this->db->prepare($updateSQL);
$updateStatement->execute();
} }
Слайд 25
Актуализиране на БД след гласуване 2/2
<?php
//controllers/poll.php
include_once "models/Poll.class.php";
$poll = new Poll( $db );
// проверка дали формата е изпратена
$isPollSubmitted = isset( $_POST['user-input'] );
//ако формата е изпратена
if ( $isPollSubmitted ) {
// получаваме входа, получен от формата
$input = $_POST['user-input'];
//...актуализираме модела
$poll->updatePoll( $input );
}
$pollData = $poll->getPollData();
$pollAsHTML = include_once "views/poll-html.php";
return $pollAsHTML;
Слайд 26
Окончателен вид на анкетата
0 коментара
За да коментирате, трябва да сте влезли в профила си.
Влезте