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

21.08.2014 / PHP

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


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


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


Класс DB:


  1. class DB {
  2. private $host = 'localhost';
  3. private $dbname = 'php';
  4. private $user = 'root';
  5. private $pass = '';
  6.  
  7. private $options = array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8',
  8. PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC);
  9. public $db;
  10.  
  11.  
  12. public function __construct() {
  13. try {
  14. $this->db = new PDO('mysql:host='. $this->host .';dbname='. $this->dbname,
  15. $this->user,
  16. $this->pass,
  17. $this->options
  18. );
  19. $this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  20. }
  21. catch(PDOException $e) {
  22. echo 'ERROR: ' . $e->getMessage();
  23. }
  24. }
  25. }
  26.  


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


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


Класс Users:


  1. class Users extends DB {
  2. public function __construct() {
  3. parent::__construct();
  4. }
  5.  
  6. public function save($data) {
  7. $query = $this->db->prepare("INSERT users (name, email, password) VALUES (:name, :email, :password)");
  8. return $query->execute(array(
  9. 'name' => $data->name,
  10. 'email' => $data->email,
  11. 'password' => md5($data->password)));
  12. }
  13.  
  14. public function getList() {
  15. $query = $this->db->prepare("SELECT id, name, email FROM users");
  16. $query->execute();
  17. return $query->fetchAll();
  18. }
  19.  
  20. public function getById($id) {
  21. $result = false;
  22. if($id) {
  23. $query = $this->db->prepare("SELECT id, name, email FROM users WHERE id = :id");
  24. $query->execute(array('id' => $id));
  25. $result = $query->fetch();
  26. }
  27. return $result;
  28. }
  29. }


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


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


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


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


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


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


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

 

рекомендуемые программы

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