Думаю тема будет многим интересна, что нам дает PDO?
1) Очень быстрый класс для работы с БД
2) Более лучшая защита при запросах к БД
3) Универсальность, в любой момент можно перескочить на скажем PostgreeSQL и при этом вам не придется лопатить весь сайт переделывая запросы к БД.
---------------
Для удобства выдергиваем уже готовый класс из движка RotoCMS, дабы не мучиться в дальнейшем с определениями использовать ?id или :id
1) Обращение к PDO:
обращение к классу PDO происходит непосредственно через DB::run()
2) MYSQL_QUERY:
запрос вида mysql_query будет бить ошибку, и ничего работать не будет, для этого используем
<?php
$a = DB::run()->query("SELECT `name` FROM `user` WHERE `id`=? LIMIT 1",array($id));
?>
тут мы видим id=?,"array($id)) , именно эта конструкция непозволяет производить sql-inj в PDO, можно использовать и id='$id' , но тут уже нужно тщательно смотреть на фильтрацию переменной. (не буду описывать почему именно и что не дает проводить инъекции)
3) MYSQL_FETCH_ASSOC - MYSQL_FETCH_ARRAY:
Данный метод использовать в PDO можно следующими способами
<?php
$q = DB::run() ->query("SELECT `name` FROM `user` WHERE `id`=? LIMIT 1",array($id));
$q = $q - >fetch();
/* или */
$q = DB::run() - > queryFetch("SELECT `name` FROM `user` WHERE `id`=? LIMIT 1",array($id));
?>
3) Циклы WHILE и FOREACH:
<?php
/* while */
$while = DB::run() ->query("SELECT * FROM `user`");
while($while = $while - > fetch()){
echo $while['name'].' - '.$while['datereg'].'<br/>';
}
/* foreach тут лучше использовать несколько иной метод, итак поехали*/
$foreach = DB::run() ->query("SELECT * FROM `user`");
$foreach = $foreach - > fetchAll();
foreach($foreach AS $fors){
echo $fors['name'].' - '.$fors['datereg'].'<br/>';
}
?>
4) MYSQL_AFFECTED_ROWS - MYSQL_NUM_ROWS:
<?php
/* тут тоже существует два способа получения данных*/
/* первый способ */
$one = DB::run() ->query("SELECT * FROM `user`");
$one = $one -> fetchAll();
$ones = count($one);
if($ones > 0){
echo $ones;
}
/* второй способ, он мне нравится больше */
$two = DB::run() -> query("SELECT * FROM `user`");
if ($two -> rowCount() > 0) {
echo $two->rowCount();
}
?>
________ посл. ред. 30.06.2015 в 12:27; всего 1 раз(а); by titanZ
titanZ (30.06.2015 в 11:48)
Саня (30.06.2015 в 11:46)
Mysqli быстрее, насчёт 3 пункта согласен, но не думаю что кто то в вапе будет прыгать с mysql на
PostgreSQL
Да но он лучше в защите и универсальности :)
$var = $db->real_escape_string($var);
и шлем нах взломщиков по sql inj
MySQL и MySQLi та же хрень, одна новая версия, другая старая, не знаю почему вы так сильно их разделяете, и PostgreSQL при большем объеме данных их обходит, по поводу скорости PDO я бы усомнился в скорости, тут смотря с чем сравнивать, если брать PDO в PHP и в серверном JS, к примеру NodeJS, то там класс PDO написан куда лучше и работает шустрее, если сравнивать прямые обращения в PHP и через PDO то возможно и быстрее, но юзать PDO конечно же надо, зная как многие любят прямо POST GET переменные в SQL запросы подставлять