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

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


Боковая панель

Связь

pdo

PDO

Homepage:PDO

PDO (PHP Data Objects) - это уровень для доступа к базам данных, который обеспечивает унифицированные методы для доступа к различным базам данных. PDO появился в PHP начиная с версии 5.1.

Преимущества PDO:

  • PDO работает быстрее, так как он написан на языке C;
  • предоставляет готовый интерфейс взаимодействия с БД, независимо от типа БД. Т.е. вы можете писать в своих скриптах запросы для MySQL, но при этом использовать базу данных SQLite, в этом случае PDO эмулирует нужные функции своими силам;
  • используя стандартные средства библиотеки PDO, можно организовать фильтрацию запросов в базу данных, проверку запросов по маске, проверку запросов на наличие определенных типов данных, что существенно снижает вероятность инъекции.
  • PDO для каждого типа БД требует подключение драйвера.
    <?php
    // Получить список драйверов, доступных в системе
    print_r(PDO::getAvailableDrivers()); 
    ?>
  • Закрытие соединения и освобождение ресурсов:
    $bd = NULL;
  • Метод query - режимы вывода PDOStatement::fetch:
    $dbconn->query($sql)->fetch(PDO::FETCH_ASSOC);
  • Метод quote - фильтрация строк. Экранирование символов при вставке в БД. PDO сама определит какой алгоритм экранирования применить в зависимости от драйвера БД.
    // Фильтрация строк. Экранирование символов при вставке в БД
    $dbconn = new PDO("создали подключение");
    $name = "O'Brain"; // Перед вставкой в БД нужно экранировать одинарную кавычку
    
    $name = $dsn->quote($name);// экранируем
    
    $sql = "INSERT INTO tbl(name) VALUES ($name)";
    $res = $dbconn1->exec($sql);
    echo $res; // выведется кол-во обработанных строк

PDO MySQL

  • Новое соединение с базой данных MySQL:
    try { 
         $bd = new PDO('mysql:host=хост;dbname=база', 'логин(или переменная)', 'пароль(или переменная)'); 
    }catch (PDOException $e){
    	print "Error!: " . $e->getMessage() . "<br />";
    }

try - попытка подключения к базе (критической ошибки не будет), если подключение не прошло - будет выведена ошибка которую отдает непосредственно база данных MySQL.

  • Подключение к MySQL с проверкой на наличие уже существующего подключения.
    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());

PDO PostgreSQL

  • Новое соединение с базой данных PostgreSQL:
    <?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 />";
    }
    
    ?>
  • Подключение к PostgreSQL с проверкой на наличие уже существующего подключения. Эта проверка позволяет не открывать дополнительные соединения с базой данных, а использовать всегда единственное соединение с БД. Реализовано через статическую переменную.
    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);
  • Подключение к PostgreSQL с проверкой на наличие уже существующего подключения. Используя шаблон проектирования Singleton. Самый достойный вариант можно посмотреть у Tony Landis по ссылке PHP5 PDO Singleton Class или на github.

PDO SQLite

  • Пример подключения к БД SQLite (test.db).
    try {
        $dbconn = new PDO("sqlite:test.db");
    } catch (PDOException $e) {
        print "Error!: " . $e->getMessage();
    }
    
    
    $dbconn= NULL; // закрыть соединение

Ссылки

pdo.txt · Последние изменения: 2013/03/04 13:17 (внешнее изменение)