Инструменты пользователя

Инструменты сайта


pdo

Различия

Здесь показаны различия между двумя версиями данной страницы.

Ссылка на это сравнение

pdo [2018/08/25 01:13] (текущий)
Строка 1: Строка 1:
 +====== Настройка и использование PDO — расширения PHP Data Objects для работы с базами данных ======
  
 +~~Title: PDO PHP ~~
 +{{htmlmetatags>​
 +metatag-description=(Класс PDO. Примеры PDO на PHP для PostgreSQL, MySQL, SQLite. Что такое php pdo? Преимущества PDO. Как Перейти на использование PHP PDO.)
 +}}
 +{{ ::​php-pdo-01.jpg?​nolink&​400 |}}
 +
 +Homepage:​[[http://​php.net/​manual/​ru/​book.pdo.php|PDO]]
 +
 +**PDO** (PHP Data Objects) - это уровень для доступа к базам данных,​ который обеспечивает унифицированные методы для доступа к различным базам данных. PDO появился в [[PHP]] начиная с версии 5.1.
 +
 +**Преимущества PDO:**
 +  * PDO работает быстрее,​ так как он написан на языке C;
 +  * предоставляет готовый интерфейс взаимодействия с БД, независимо от типа БД. Т.е. вы можете писать в своих скриптах запросы для [[MySQL]], но при этом использовать базу данных [[SQLite]], в этом случае PDO эмулирует нужные функции своими силам;
 +  * используя стандартные средства библиотеки PDO, можно организовать фильтрацию запросов в базу данных,​ проверку запросов по маске, проверку запросов на наличие определенных типов данных,​ что существенно снижает вероятность инъекции.
 +
 +  * PDO для каждого типа БД требует подключение драйвера.<​file>​
 +<?php
 +// Получить список драйверов,​ доступных в системе
 +print_r(PDO::​getAvailableDrivers()); ​
 +?>
 +</​file>​
 +
 +  * **Закрытие соединения** и освобождение ресурсов:​ <​file>​
 +$bd = NULL;
 +</​file>​
 +  * **Метод query - режимы вывода** [[http://​php.net/​manual/​ru/​pdostatement.fetch.php|PDOStatement::​fetch]]:<​file>​
 +$dbconn->​query($sql)->​fetch(PDO::​FETCH_ASSOC);​
 +</​file>​
 +  * **Метод quote - фильтрация строк**. Экранирование символов при вставке в БД. PDO сама определит какой алгоритм экранирования применить в зависимости от драйвера БД.<​file>​
 +// Фильтрация строк. Экранирование символов при вставке в БД
 +$dbconn = new PDO("​создали подключение"​);​
 +$name = "​O'​Brain";​ // Перед вставкой в БД нужно экранировать одинарную кавычку
 +
 +$name = $dsn->​quote($name);//​ экранируем
 +
 +$sql = "​INSERT INTO tbl(name) VALUES ($name)";​
 +$res = $dbconn1->​exec($sql);​
 +echo $res; // выведется кол-во обработанных строк
 +</​file>​
 +====== PDO MySQL ======
 +  * **Новое соединение** с базой данных [[MySQL]]:<​file>​
 +try { 
 +     $bd = new PDO('​mysql:​host=хост;​dbname=база',​ '​логин(или переменная)',​ '​пароль(или переменная)'​); ​
 +}catch (PDOException $e){
 + print "​Error!:​ " . $e->​getMessage() . "<​br />";​
 +}
 +</​file>​
 +
 +try - попытка подключения к базе (критической ошибки не будет),​ если подключение не прошло - будет выведена ошибка которую отдает непосредственно база данных MySQL.
 +  * **Подключение к MySQL** с проверкой на наличие уже существующего подключения.<​file>​
 +function PDOMySQLocal() {// connect to DB MySQL
 +    static $dbconn;
 +    if (is_null($dbconn)) {
 +
 +        try {
 +            $host = '​127.0.0.1';​
 +            $port = 3306;
 +            $dbname = '​yourdb';​
 +            $dsn = "​mysql:​host=$host;​port=$port;​dbname=$dbname";​
 +            $username = '​root';​
 +            $passwd = '';​
 +            $dbconn = new PDO($dsn, $username, $passwd);
 +//            $dbconn->​setAttribute(PDO::​ATTR_ERRMODE,​ PDO::​ERRMODE_EXCEPTION);​
 +        } catch (PDOException $e) {
 +            print "​Error!:​ " . $e->​getMessage() . "<​br />";​
 +        }
 +    }
 +    return $dbconn;
 +}
 +
 +$cdb = PDOMySQLocal();​
 +$sql = '​SELECT * FROM  Countries LIMIT 5;';
 +try {
 +    $res = $cdb->​query($sql);​
 +} catch (PDOException $e) {
 +    print "​Error!:​ " . $e->​getMessage() . "<​br />";​
 +}
 +$res->​setFetchMode(PDO::​FETCH_ASSOC);​ // устанавливаем режим выборки
 +print_r($res->​fetchAll());​
 +</​file>​
 +====== PDO PostgreSQL ======
 +  * **Новое соединение** с базой данных [[PostgreSQL]]:<​file>​
 +<?php
 +
 +try {
 +    $host = '​localhost';​
 +    $port = 5432;
 +    $dbname = '​postgres';​
 +    $dsn = "​pgsql:​host=$host;​port=$port;​dbname=$dbname";​
 +    $username = '​postgres';​
 +    $passwd = '';​
 +    $dbconn = new PDO($dsn, $username, $passwd);
 +} catch (PDOException $e) {
 +    print "​Error!:​ " . $e->​getMessage() . "<​br />";​
 +}
 +
 +// Выполним тестовый SQL запрос
 +try {
 +    $sql = '​Select * FROM pg_database';​
 +    echo '<​pre>';​
 +
 +    foreach ($dbconn->​query($sql) as $row) {
 +        print_r($row);​
 +    }
 +} catch (PDOException $e) {
 +    print "​Error!:​ " . $e->​getMessage() . "<​br />";​
 +}
 +
 +?>
 +</​file>​
 +  * **Подключение к PostgreSQL с проверкой на наличие уже существующего подключения**. Эта проверка позволяет не открывать дополнительные соединения с базой данных,​ а использовать всегда единственное соединение с БД. Реализовано через [[http://​php.net/​manual/​ru/​language.variables.scope.php#​language.variables.scope.static|статическую переменную]].<​file>​
 +function PDOPgSQL() {// connect to DB PostgreSQL
 +    static $dbconn;
 +    if (is_null($dbconn)) {
 +
 +        try {
 +    $host = '​localhost';​
 +    $port = 5432;
 +    $dbname = '​postgres';​
 +    $dsn = "​pgsql:​host=$host;​port=$port;​dbname=$dbname";​
 +    $username = '​postgres';​
 +    $passwd = '';​
 +            $dbconn = new PDO($dsn, $username, $passwd);
 +        } catch (PDOException $e) {
 +            print "​Error!:​ " . $e->​getMessage() . "<​br />";​
 +        }
 +    }
 +
 +    return $dbconn;
 +}
 +
 +$cdb = PDOPgSQL();
 +$sql = '​SELECT * FROM phrases';​
 +$cdb->​query($sql);​
 +</​file>​
 +  * **Подключение к PostgreSQL с проверкой на наличие уже существующего подключения**. Используя шаблон проектирования Singleton. Самый достойный вариант можно посмотреть у Tony Landis по ссылке [[http://​tonylandis.com/​php/​php5-pdo-singleton-class/​|PHP5 PDO Singleton Class]] или на [[https://​gist.github.com/​31464|github]].
 +
 +====== PDO SQLite ======
 +  * Пример подключения к БД [[SQLite]] (test.db).<​file>​
 +try {
 +    $dbconn = new PDO("​sqlite:​test.db"​);​
 +} catch (PDOException $e) {
 +    print "​Error!:​ " . $e->​getMessage();​
 +}
 +
 +
 +$dbconn= NULL; // закрыть соединение
 +</​file>​
 +===== Дополнительные ссылки PDO =====
 +  * [[http://​dandreev.com/​blog/​php-pdo-kratkoe-rukovodstvo/​|PHP PDO. Краткое руководство ]]
 +  * [[http://​ruseller.com/​lessons.php?​rub=28&​id=610|Почему следует использовать PDO для доступа к базам данных?​]]
 +  * [[http://​www.inphp.org/​arts/​doc/​12|PDO - Самый быстрый в работе с базами данных]]
загрузка...
pdo.txt · Последние изменения: 2018/08/25 01:13 (внешнее изменение)