С первого раза не получилось написать статью, писал прямо в браузере в админке, и когда статья уже была готова, браузер упал – это было очень обидно.
В этой статье я хочу рассказать о 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 и многое другое.
К сожалению вторая попытка написать статью получилась намного хуже, второй раз пытаться описать пример довольно утомительно.
