Различия

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


pdo [2025/07/06 12:39] (текущий) – создано - внешнее изменение 127.0.0.1
Строка 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 - Самый быстрый в работе с базами данных]]

📌 Удобный подбор VPS по параметрам доступен на DIEGfinder.com - официальном инструменте проекта DIEG. Это часть единой экосистемы, созданной для того, чтобы помочь быстро найти подходящий VPS/VDS сервер для любых задач хостинга.

📌 Для тестирования скриптов, установщиков VPN и Python-ботов рекомендуем использовать надежные VPS на короткий срок. Подробнее о быстрой аренде VPS для экспериментов - читайте здесь.

💥 Подпишись в Телеграм 💥 и задай вопрос по сайтам и хостингам бесплатно!