Простой пример PDO: SELECT и INSERT (PHP)

пример pdo phpС первого раза не получилось написать статью, писал прямо в браузере в админке, и когда статья уже была готова, браузер упал – это было очень обидно.


В этой статье я хочу рассказать о PDO, а точнее показать несколько простых примеров на PHP с использованием PDO, а именно использование подготавливаемых (prepare) запросов.
Использование подготавливаемых запросов повышает производительность за счет оптимизации плана выполнения. Так же используя подготавливаемые запросы PDO нет смысла экранировать входящие параметры, Вы можете быть уверены в том, что никакие SQL инъекции не пройдут. Для более полной информации я советую почитать официальную документацию языка PHP.


В данном примере я описал выполнение запросов SELECT и INSERT. Я создал таблицу пользователей и создал два класса для работы с базой данных и для работы с пользователями.


Класс DB:


class DB { 
    private $host   = 'localhost';
    private $dbname = 'php';
    private $user   = 'root';
    private $pass   = '';
    
    private $options = array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8',
                             PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC);
    public $db;


    public function __construct() {
        try {
            $this->db = new PDO('mysql:host='. $this->host .';dbname='. $this->dbname,
                                    $this->user,
                                    $this->pass,
                                    $this->options
                                );
            $this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        }
        catch(PDOException $e) {
            echo 'ERROR: ' . $e->getMessage();
        }
    }
}


Теперь по порядку, первые четыре свойства содержат настройки для соединения с базой данных, имя пользователя базы данных, пароль (у меня его нет), название базы данных (я зачем то назвал ее PHP) и где размещена база. Пятое свойство - $options содержит дополнительные параметры, где указывается, что мы используем кодировку UTF-8, и то что по умолчанию мы хотим получает ассоциативный набор данных. Свойство $db будет хранить сам объект PDO.


В классе у нас объявлен метод конструктор в котором происходит соединения с базой, в случае неудачи выполнится исключение.


Класс Users:


class Users  extends DB {
    public function __construct() {
        parent::__construct();
    }
    
    public function save($data) {
        $query = $this->db->prepare("INSERT users (name, email, password) VALUES (:name, :email, :password)");
        return $query->execute(array(
                                        'name'  => $data->name, 
                                        'email' => $data->email,
                                        'password' => md5($data->password)));
    }
    
    public function getList() {
        $query = $this->db->prepare("SELECT id, name, email FROM users");
        $query->execute();
        return $query->fetchAll();
    }
    
    public function getById($id) {
        $result = false;
        if($id) {
            $query = $this->db->prepare("SELECT id, name, email FROM users WHERE id = :id");
            $query->execute(array('id' => $id));
            $result = $query->fetch();
        }
        return $result;
    }
}


В классе Users и представлены сами методы с запросами. В конструкторе вызывается конструктор родительского класса, таким образом мы получаем в свойство $db объект для работы с базой данных.


Метод save() – обратите внимание как передается запрос в prepare, через двоеточие определяются псевдопеременные значения которых подставляются из массива который будет передан в execute, хочу отметить что это не единственный способ передачи значений. После выполнения execute возвращает успешно ли был выполнен запрос или нет.


Методы getById() и getList(), так же как и с save() подготавливаются запросы и передаются запросы, разница только в том, что мы должны обработать полученный результат, для этого используются методы fetchAll() – который позволяет получить весь набор данных и fetch() – для получения одной записи.


Как Вы могли заметить я не экранирую параметры, можете сами поиграться и провести SQL инъекцию тем самым проверить безопасность использования PDO.


Так же данный пример можно скачать, именно он в последующих статьях будет использоваться. Дальше я собираюсь показать примеры с запросами UPDATE и DELETE, использовать паттерн сингтон в классе DB и многое другое.


К сожалению вторая попытка написать статью получилась намного хуже, второй раз пытаться описать пример довольно утомительно.


Скачать пример PDO PHP

Случайные статьи

Статья Чужие герои в Uncharted 2 добавлена с разрешения редакции сайта Игромания.Автор: Роман Епишин. В этот четверг, 28 января, компания Sony выпустит загружаемое дополнение PlayS...

Статья Процессоры Intel Celeron станут еще быстрее добавлена с разрешения редакции сайта Игромания.Автор: Павел Шубский. Доисторический бренд Intel Celeron никак не хочет сдаватьс...

Статья Capcom расскажет предысторию Dead Rising 2 добавлена с разрешения редакции сайта Игромания.Автор: Андрей Чаплюк. Capcom наконец-то назвала дату выхода экшена Dead Rising 2. ...

Статья Mass Effect не спешит в Голливуд добавлена с разрешения редакции сайта Игромания.Автор: Андрей Чаплюк. Кейси Хадсон из BioWare прояснил ситуацию вокруг возможной экранизации...

Новая версия самой необходимой программы на любом компьютере - Office 15 была разослана тестировщикам. Что нового в новом Office 15 не оглашается, но стало известно, что все програ...