Библиотека 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"$namePDO::PARAM_STR255);
        
$query->bindParam(":language_id"$language_idPDO::PARAM_INT11);
        
$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"$namePDO::PARAM_STR255);
        
$query->bindParam(":language_id"$language_idPDO::PARAM_INT11);
        
$query->bindParam(":category_id"$category_idPDO::PARAM_INT11);
        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_idPDO::PARAM_INT11);
        
$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_idPDO::PARAM_INT11);
        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_idPDO::PARAM_INT11); Подготовливаем переменную :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

Содержание
Размещение любых материалов с сайта OX2.ru на других сайтах, блогах, печатных изданиях и т.д. ссылка на сайт http://ox2.ru/ обязательна!

Оставить вопрос или комментарий

PARAM_STR [25.09.2011 00:56]
а как установить тип для строки что бы к ней не добавлялись одинарные кавычки?
Администратор OX2 [25.09.2011 11:05]
А с какой целью?
PARAM_INT [24.11.2011 16:13]
запрос типа:
SELECT ... FROM ... WHERE ... ORDER BY ... :sort

где sort может принимать значение DESC или ASK, добавление кавычек к которому неприемлемо))
PARAM_INT [24.11.2011 16:29]
извиняюсь, ASC. в общем надо сортировать по возрастанию или убыванию. Простите, конечно, если вопрос глупый и так делать нельзя.
Администратор OX2 [17.12.2011 15:55]
Можно всунуть напрямую в SELECT переменную:

"SELECT ... FROM ... WHERE ... ORDER BY ... $sort"
Имя:
Сообщение: