Простой пример 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

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

Помните Doom? Уверен, что многие бы хотели еще раз попасть в этот мир, полон нечестии, кишков и мяса. Появился небольшой слух о том, что следующая игра id Software, хочу заметить э...

Рэнди Питчфорд, глава студии Gearbox Software дал небольшое интервью журналистам CVG в котором поделился своим впечатлением от игры Duke Nukem Forever. В беседе было сказано, что н...

Статья NVIDIA: Приход DX11 не увеличит продажи видеокарт добавлена с разрешения редакции сайта Игромания.Автор: Павел Шубский. Представители компании NVIDIA поделились своим в...

Статья VESA усовершенствует спецификации DisplayPort добавлена с разрешения редакции сайта Игромания.Автор: Павел Шубский. Разработчики стандарта DisplayPort представили обновленну...

Оригинал статьи можно прочесть перейдя по ссылке Steam – от "яблок" до "пингвинов" на сайте "Игромания".Valve Software запустит сервис Steam не только на Apple, но и на Linux. ...