Клас PDO, или грамотная и современная работа с БД - Форум Cheat-Master.ru
  • Страница 1 из 1
  • 1
Модератор форума: Sanoxxx, Alowir  
Клас PDO, или грамотная и современная работа с БД
Radiance Дата: Суббота, 06.06.2015, 19:22 | Сообщение # 1
Боец
Сообщений: 209
Статус: Offline
По мере старения, и увеличения неуклюжести и неудобности функций типа mysql_чтототам() братьям-программистом стало поднадоедать пятидесяти этажное строение запросов стандартного драйвера mysql, его топорность, тупость, и уродство. Ну и у умных человеков, выкравших некоторое количество свободного времени, удалось запилить очень удобную штуку, которая получило название в виде аббревиатуры PDO

PDO расшифровывается как PHP Data Objects и представляет собой класс, удобный для работы с БД, и имеющий кучу интересных фич, которые позволяют нам, к примеру, не беспокоиться более о sql inj (больная тема для юных падаванов).

Приступим.

PDO является как бы "прослойкой" между нами, как уставшими красноглазыми программистами, и драйвером, который работает с базой. Т.е. де-факто имеем следующую цепочку:

Программист -> PDO -> драйвер mysql


Исходя из вышесказанного PDO адекватно работает с любыми SQL-запросами, поэтому что то по этому поводу перечитывать-переучивать не придётся.

Рассмотрим примеры.



1. Соединение с базой.


Для этого нагло копипиздим код ниже:

Код


<?php

try
{   // Подключаемся
     $db = new PDO('mysql:host=адрес сервера SQL;dbname=имя базы','пользователь','пароль');
}
     // Если есть ошибки
catch(PDOException $e)
{    // То смерть НИВЕРНЫМ!!!
     die("Error: ".$e->getMessage());
}


Теперь у нас в переменной $db лежит вся магическая мощь PDO, подвластная нам.


Сразу же после этого рекомендую отправить такой запрос:
Код

$db->exec("SET NAMES UTF8"); // либо вместо утф-8 любая другая кодировка


Да бы избежать каких то конфликтов с кодировками и не пользоваться ужасной функцией iconv().

Кстати, настоятельно не рекомендуется использовать функцию exec кроме как для конфигурирования текущего соединения и пихать туда какие либо переменные. Это то самое окно, которое остаётся открытым вору, но и закрывать нам его не желательно, так что будьте внимательны.



2. Запросы PDO



В PDO основными функциями, отправляющими запрос являются prepare и query.
В чем различие спросите вы? А в следующем.

Функция prepare позволяет создавать предподготовленные запросы, которые мы будем использовать в дальнейшем, даёт возможность биндить данные (об этом ниже), и многое другое.
Функция query является аналогом mysql_query(), и используется для отправки статический запросов, которые не подразумевают какие то данные, пришедшие извне.


Для начала разберём функцию prepare
Как я уже сказал выше - эта функция даёт нам возможность создавать предподготовленный запрос для дальнейшего использования.
Это значит, что раз задав структуру запроса мы можем использовать его сколько угодно раз,лишь изменяя значения каких то там данных, которые уходят с запросом.
Самое главное, что доступно в полной мере при prepared-запросах - бинд данных.
Простыми словами при бинде значение наших переменных прогоняется через кучу функций, которые экранируют кавычки и спец символы,отсекают всякую каку, которую засовывают хацкиры при поиске SQL Inj и прочее прочее прочее.
Бинд может быть именованным и неименованным, односторонним и двусторонним. Разберем это дело.


Часть функции бинда я описал выше. Его роль в prepared-запросе так же связывание переменной с плейсхолдером.
Грубо говоря, плейсхолдер это переменная в самом SQL-запросе, связываемая с переменной из кода.


Что бы было понятнее, рассмотрим код ниже
Код

// Подготовим запрос
$prepare = $db->prepare("SELECT `text` FROM `table` WHERE `id` = :id");

Здесь :id - плейсхолдер.
Код

$prepare -> bindParam(":id", $id, PDO::PARAM_INT);  


Здесь мы используем односторонний бинд, где привязываем плейсхолдер :id к переменной $id и указываем, что это обязательно число - PDO::PARAM_INT

Код

$prepare->execute(); // отправляем запрос.  



PDO всегда возвращает bool, соответственно, если база вернула данные, то $prepare будет true, иначе - false.

В примере увидели, что мы указали :id как int.
Самые используемые варианты это PARAM_INT - для чисел, PARAM_STR - для строк. Кому интересно что-либо еще - могут прогуглить.



Двусторонний бинд проводится при помощи функции bindValue(), в принципе, его действие аналогично функции выше, с той лишь разницей, что пробинденная переменная будет использоваться не только в запросе, но и после него.




Функция query, как я уже сказал, является полным аналогом стандартного mysql_query().
Оставлю пример просто для галочки:

Код

$query = $db->query("SELECT * FROM `table` WHERE `int` = $var");





3. Преобразование данных для дальнейшей работы


Преобразовать данные для дальнейшей работы можно при помощи функции fetch

Естественно, данные после запроса можно преобразовать в различные виды. Рассмотрим основные самые используемые варианты:
OBJ - преобразует данные в объект.
ASSOC - преобразует данные в ассоциативный массив
BOTH - смесь индексированного массива с ассоциативным.

Пример преобразования данных после запроса:

Код

$arr = $prepare->fetch(PDO::FETCH_ASSOC);  


В данном примере мы преобразовали полученные нами данные в ассоциативный массив.

Всё достаточно таки просто.



4. Послесловие


Здесь я просто представлю вам еще несколько полезных функций. Аналоги которых есть и у стандартного mysql_query().




Функция rowCount() - возвращает число строк, затронутых запросом.
Сразу обратите внимание, что эта функция работает ТОЛЬКО С ПРЕДПОДГОТОВЛЕННЫМИ ЗАПРОСАМИ.

Пример:
Код

$count = $prepare->rowCount();  


Возвращает просто целое число.



Функция errorinfo() возвращает код и описание ошибки, возникшей при запросе. Если ее нет, вернет пустой массив.

Пример:

Код

print_r($prepare->errorinfo());




Функция LastInsertId() возвращает номер последней вставленной строки по автоинкрементному столбцу.

Пример:

Код


$prepare = $db->prepare("INSERT INTO `table`(`column1`,`column2`) VALUES(?,?)"); // Здесь, кстати, мы видим неименованный бинд, который я забыл описать выше.
$prepare->bindParam(1, $var1, PDO::PARAM_INT); // ПРобиндили первую переменную  
$prepare->bindParam(2, $var2, PDO::PARAM_STR); // Пробиндили вторую
$prepare->execute(); // Отправили запрос.  

$insID = $prepare->lastInsertId(); // Отдаст номер вставленной строки




Пример многократного использования одного prepared запроса:

Код

$prepare = $db->prepare("SELECT * FROM `table` WHERE `id` = :id");
$prepare->bindParam(":id", $id, PDO::PARAM_INT);
$prepare->execute();

$arr = $prepare->fetch(PDO::FETCH_ASSOC);

$id = 142325;  

$prepare->bindParam(":id", $id, PDO::PARAM_INT);
$prepare->execute();

$arr-two = $prepare->fetch(PDO::FETCH_BOTH);

$prepare->bindParam(":id", $_SESSION['uid'], PDO::PARAM_INT);
$prepare-> execute();

$arr-three = $prepare->fetch(PDO::FETCH_OBJ);  




Ну и не забываем обрывать соединение с базой после окончания работы:

Код

$db = null;





Надеюсь, материал вышел достаточно понятным и информативным.

АХТУНГ.
При копипиздинге материала указываем дядюшку Радианса как своего папку и бога всея мира. Ну и ссылочку на источник, естессна.
В случае обнаружения данного материала где либо без указания первоисточника нагло накатаю абузу в яшу да гуглю.
Ибо задрочился периодически наблюдать свой материал на недосайтегах.

Пока.



Радик камбек :D

Bluetooth Дата: Суббота, 06.06.2015, 21:27 | Сообщение # 2
Бывалый
Сообщений: 400
Статус: Offline
А ссылку можно ли ?
А так всё круто и понятно.
Radiance Дата: Воскресенье, 07.06.2015, 06:59 | Сообщение # 3
Боец
Сообщений: 209
Статус: Offline
Bluetooth, он встроен в интерпретатор, так что просто пиши.


Радик камбек :D

  • Страница 1 из 1
  • 1
Поиск: