Наше прошлое 20072009201120132014
г. Москва, ул. Гостиничная, д. 7А. кор.2
8 (499) 404-26-56
пн-пт 11:00 - 19:00
 

Библиотека PDO. Абстракция баз данных в PHP5

При разработке крупных web-проектов, создании интернет-магазинов, или обычных сайтов, у любого программиста возникает необходимость в абстракции базы данных..

Для абстракции базы данных в PHP5 включена поддержка библиотеки PDO. PHP PDO работает очень быстро, и защищает сайт от самой распространенной атаки - "SQL-инъекция". 
Рассмотрим класс для работы с меню на сайте. Класс должен читать/добавлять/изменять/удалять разделы меню на сайте.

Для начала создадим базу данных:

CREATE DATABASE `ox2.ru` 

Теперь наполним ее таблицей:

CREATE TABLE `ox2.ru`.`category` (
`id` INT( 11 ) NULL AUTO_INCREMENT PRIMARY KEY ,
`created` DATETIME NULL DEFAULT NULL ,
`name` VARCHAR( 255 ) NOT NULL ,
`language_id` INT( 11 ) NOT NULL DEFAULT '1',
INDEX ( `language_id` )
) ENGINE = MYISAM ;'}
    

PHP-код с подробным описанием:

<?php
class Category {
    private $_db = null;

    public function __construct(PDO $db) {
        $this->_db = $db;
    }

    /**
     * Добавление нового раздела меню
     * @param <string> $name - название раздела меню
     * @param <integer> $language_id - язык разделов меню (русский?)
     * @return <object>
     */
    public function add($name, $language_id = 0) {
        $query = $this->_db->prepare("INSERT INTO category (`created`,`name`, `language_id`) VALUES (NOW(), :name, :language_id)");
        $query->bindParam(":name", $name, PDO::PARAM_STR, 255);
        $query->bindParam(":language_id", $language_id, PDO::PARAM_INT, 11);
        $query->execute();
        return $this->_db->lastInsertId(); //возвращаем id-добавленной строки
    }

    /**
     * Редактирование меню
     * @param <integer> $category_id - id раздела, который необходимо редактировать
     * @param <string> $name - название раздела меню
     * @param <integer> $language_id - язык разделов меню (русский?)
     * @return <boolean>
     */
    public function edit($category_id, $name, $language_id = 0) {
        $query = $this->_db->prepare("UPDATE category SET  `name` = :name, `language_id`=:language_id WHERE id=:category_id");
        $query->bindParam(":name", $name, PDO::PARAM_STR, 255);
        $query->bindParam(":language_id", $language_id, PDO::PARAM_INT, 11);
        $query->bindParam(":category_id", $category_id, PDO::PARAM_INT, 11);
        return $query->execute();
    }

    /**
     *
     * @param <integer> $language_id - язык разделов меню (русский?)
     * @return <boolean>
     */
    public function getCategory($language_id = 0) {
        $query = $this->_db->prepare("SELECT category.* FROM category WHERE language_id=:language_id");
        $query->bindParam(":language_id", $language_id, PDO::PARAM_INT, 11);
        $query->execute();
        return $query->fetchAll(PDO::FETCH_OBJ);
    }

    /**
     *
     * @param <integer> $category_id - id раздела, который необходимо удалить
     * @return <boolean>
     */
    public function delCategory($category_id) {
        $query = $this->_db->prepare("DELETE FROM `category` WHERE `id` = :category_id");
        $query->bindParam(":category_id", $category_id, PDO::PARAM_INT, 11);
        return $query->execute();
    }

}

$db = new PDO("mysql:dbname=ox2.ru;host=localhost", "root", "ox2.ru"); //Соеденяемся с базой данной «ox2.ru», хост «localhost», логин «root», пароль «ox2.ru»
$category = new Category($db); //Создаем объект для работы с разделами меню
$category_1_id = $category->add("Новая категория 1", 1); //Добавляем новую категорию, функция возвращает id-добавленной строки
$category_2_id = $category->add("Новая категория 2", 1); //Добавляем новую категорию
$category_3_id = $category->add("Новая категория 3", 1); //Добавляем новую категорию

if ($category->delCategory($category_2_id)) { //Удаляем категорию
    echo "Удалена вторая категория!!<br/>";
}
if ($category->edit($category_1_id, "Старая категория", 1)) { //Редактируем категорию
    echo "Успешно изменено!<br/>";
}
echo "<p>Меню:</p>";
foreach ($category->getCategory(1) as $category_item) { //Выводим разделы меню
    echo $category_item->name . "<br/>";
}
?>

Поскольку наше меню расчитано на несколько языков, мы ввели столбец language_id, если он равен 1, то язык меню русский

Теперь более подробно о работе библиотеки PDO. Для отправки запросов через PDO нужно сделать 4 основных шага:

  1. Соединиться с базой данных:
    <?php $db = new PDO("mysql:dbname=ox2.ru;host=localhost", "root", "ox2.ru");  
    Здесь имя базы данных «ox2.ru», хост «localhost», логин «root», пароль «ox2.ru»
  2. Подготовить запрос на выполнение:
    <?php $query = $db->prepare("SELECT category.* FROM category WHERE language_id=:language_id"); 
    :language_id - это переменная, которая будет установленна ниже
  3. Подготовить входящие переменные:
    <?php $query->bindParam(":language_id", $language_id, PDO::PARAM_INT, 11); Подготовливаем переменную :language_id, устанавливаем ей тип PDO::PARAM_INT, и максимальное кол-во знаков - 11.

    Чаще всего используются следующие типы:

    PDO::PARAM_INT - числа
    PDO::PARAM_STR - строки
    PARAM_BOOL - числа от 0 до 10
  4. Выполнить запрос: 
    <?php $query->execute();
  5. Посмотреть нет ли ошибок:
    <?php print_r($query->errorInfo());
  6. Вывести результат:
    <?php print_r($query->fetchAll(PDO::FETCH_OBJ));

    Результат будет возвращен в виде массима объектов. Можно сделать в в виде числового массива, указав для функции fetchAll параметр PDO::FETCH_NUM, или в ввиде ассотивного PDO::FETCH_ASSOC

При разработке крупных web-проектов, создании интернет-магазинов, или обычных сайтов, у любого программиста возникает необходимость в абстракции базы данных.. Для абстракции базы данных в PHP5 включена поддержка библиотеки PDO. PHP PDO работает очень быстро, и защищает сайт от самой распространенной атаки - "SQL-инъекция".

Комментарии

Нет комментариев

Заполните все поля

Написать комментарий

Ваше имя

Комментарий