Все о PDO!
1. LVC2 (6 Фев 2012 в 11:02)
Думаю тема будет многим интересна, что нам дает PDO?
1) Очень быстрый класс для работы с БД
2) Более лучшая защита при запросах к БД
3) Универсальность, в любой момент можно перескочить на скажем PostgreeSQL и при этом вам не придется лопатить весь сайт переделывая запросы к БД.
---------------
2. Система (6 Фев 2012 в 11:02)
Тема успешно создана! В теме строго ЗАПРЕЩЕНЫ нецензурные выражения, флейм, флуд(кроме привата)...,создание "пустых", неинформативных сообщений,и пр., что запрещают правила сайта!(всё это не относитса к разделу Общение!)!Нарушители данных правил могут быть лишены доступа на форум.Внимание! Этот пост сгенерирован роботом, и отвечать на него ненужно!
---------------
3. LVC2 (6 Фев 2012 в 11:02)
Для удобства выдергиваем уже готовый класс из движка RotoCMS, дабы не мучиться в дальнейшем с определениями использовать ?id или :id
1) Обращение к PDO:
обращение к классу PDO происходит непосредственно через DB::$dbh
---------------
4. LVC2 (6 Фев 2012 в 11:02)
2) MYSQL_QUERY:
запрос вида mysql_query будет бить ошибку, и ничего работать не будет, для этого используем
<?
$a = DB::$dbh->query("SELECT `name` FROM `user` WHERE `id`=? LIMIT 1",array($id));
?>
тут мы видим id=?,"array($id)) , именно эта конструкция непозволяет производить sql-inj в PDO, можно использовать и id='$id' , но тут уже нужно тщательно смотреть на фильтрацию переменной. (не буду описывать почему именно и что не дает проводить инъекции)
---------------
5. LVC2 (6 Фев 2012 в 11:03)
3) MYSQL_FETCH_ASSOC - MYSQL_FETCH_ARRAY:
Данный метод использовать в PDO можно следующими способами
<?
$q = DB::$dbh -> query("SELECT `name` FROM `user` WHERE `id`=? LIMIT 1",array($id));
$q = $q -> fetch();
/* или */
$q = DB::$dbh -> queryFetch("SELECT `name` FROM `user` WHERE `id`=? LIMIT 1",array($id));
?>
---------------
6. LVC2 (6 Фев 2012 в 11:03)
3) Циклы WHILE и FOREACH:
<?
/* while */
$while = DB::$dbh->query("SELECT * FROM `user`");
while($while = $while -> fetch()){
echo $while['name'].' - '.$while['datereg'].'<br />';
}
/* foreach тут лучше использовать несколько иной метод, итак поехали*/
$foreach = DB::$dbh->query("SELECT * FROM `user`");
$foreach = $foreach -> fetchAll();
foreach($foreach AS $fors){
echo $fors['name'].' - '.$fors['datereg'].'<br/>';
}
?>
---------------
7. LVC2 (6 Фев 2012 в 11:03)
4) MYSQL_AFFECTED_ROWS - MYSQL_NUM_ROWS:
<?
/* тут тоже существует два способа получения данных*/
/* первый способ */
$one = DB::$dbh->query("SELECT * FROM `user`");
$one = $one -> fetchAll();
$ones = count($one);
if($ones > 0){
echo $ones;
}
/* второй способ, он мне нравится больше */
$two = DB::$dbh -> query("SELECT * FROM `user`");
if($two -> rowCount() > 0){
echo $two->rowCount();
}
?>
---------------
8. LVC2 (6 Фев 2012 в 11:04)
На этом пока все, вопросы задавать строго по теме!
---------------
9. MrDeath (6 Фев 2012 в 11:05)
Закрепил тему, спасибо
---------------
10. MrDeath (6 Фев 2012 в 12:03)
Можно пример записи в базу какой либо Инфы например в таблицу news?
---------------
11. LVC2 (6 Фев 2012 в 12:08)
<?
DB::$dbh->query("UPDATE `news` SET `content`=?,`user_id`=?,`date`=? WHERE `id`=? LIMIT 1",array($content,$user_id,time(),$id));
/* или INSERT(создание) */
DB::$dbh->query("INSERT INTO `news` SET `content`=?,`user_id`=?,`date`=?",array($content,$user_id,time()));
?>
---------------
12. LVC2 (6 Фев 2012 в 12:09)
использование mysql_real_escape_string ЗАПРЕЩЕНО.
mysql_insert_id() юзается в PDO как lastInsertId();
---------------
13. Скуби (6 Фев 2012 в 12:09)
Цитата: MrDeath[06.02 в 12:09] Можно пример записи в базу какой либо Инфы например в таблицу news?...
Ответ: $news = DB::$dbs->queryFetch("SELECT id,date,time FROM `news` ORDER BY `id` DESC LIMIT 1");
---------------
14. LVC2 (6 Фев 2012 в 12:10)
Цитата: Скуби[06.02 в 12:10] $news = DB::$dbs->queryFetch("SELECT id,date,time FROM `news` ORDER BY `id` DESC LIMIT 1");...
Ответ: это выборка данных, а не запись!
---------------
15. MrDeath (6 Фев 2012 в 12:16)
спасибо) понял) сегодня начну переходить на пдо)
---------------
16. LVC2 (6 Фев 2012 в 12:18)
MrDeath , нет ничего сложного вообще, когда ознакомишься то твое предпочтение будет писать на PDO нежели на обычном mysql
---------------
17. MrDeath (6 Фев 2012 в 12:20)
Цитата: LVC2[06.02 в 12:20] MrDeath, нет ничего сложного вообще, когда ознакомишься то твое предпочтение будет писать на PDO нежели на обы...
Ответ: проблема в том что я привык всё фильтровать, на пдо будет легче, и ещё не все хосты поддерживают пдо... была проблема
---------------
18. Скуби (6 Фев 2012 в 15:04)
как мне на PDO перевести свой скрипт инчата! может ресурс какой нужен почетать
---------------
19. LVC2 (6 Фев 2012 в 15:51)
по PDO в основном весь мануал на английском, но можешь погуглить на русском языке тоже имеется.
---------------
20. LVC2 (6 Фев 2012 в 15:52)
Скуби , а вообще тема создана специально для этого, если имеются какие-нибудь вопросы то можно задавать их тут.
---------------
21. Evil_Sinister (11 Фев 2012 в 16:19)
LVC2 , очень удобный класс,работаю с ним уже давно
---------------
22. Скуби (28 Фев 2012 в 15:58)
LVC2 , С какой версии php PDO есть?
---------------
23. MrDeath (28 Фев 2012 в 17:26)
Скуби , Вроде начиная с 5.1.0
---------------
24. Shankor (16 Марта 2012 в 01:57)
Я чтот немного не вьехал,при использовании ПДО не нужно фильтровать данные?
---------------
25. Shankor (16 Марта 2012 в 02:09)
Немного пробежался по форумал.
Выходит что фильтровать нужно при выводе от хss.Назрел еще один вопрос нужно ли фильтровать цифровые данные?
Update:
Отличная статья о PDO
http://habrahabr.ru/post/137664/
Изм: Shankor (16.03 в 02:30) [1]
---------------
26. MrDeath (20 Марта 2012 в 13:14)
LVC2 , $name = htmlspecialchars($loves['name']);
$count = intval($_GET['id']);
DB::$dbh->query("INSERT INTO `loves` set `name` = ?,`lovid`= ? LIMIT 1",array($name,$count));
правильно?
---
а как это пЕреписать на пдо =>
mysql_query("insert into lov (name,sid) values ($name,$aid) limit 1");
и $num= mysql_result(mysql_query("select count(*) from users"),0);
:)
---------------
27. LVC2 (20 Марта 2012 в 14:09)
MrDeath , да, правильно!
Вот:
<?PHP
DB::$dbh->query("insert into lov (name,sid) values (?,?)",array($name,$aid));
и $num= DB::$dbh->querySingle("select count(*) from users");
?>
---------------
28. LVC2 (20 Марта 2012 в 14:12)
Скуби , PHP => 5.2.1
---------------
29. MrDeath (20 Марта 2012 в 14:15)
Цитата: LVC2[20.03 в 14:15] MrDeath, да, правильно!
Вот:
<?PHP
DB::$dbh->query("insert into lov (name,sid) values (?,?)",array($name,$aid));
и $num= DB::$dbh-...
Ответ: Спасиб огромное)
---------------
30. -=JAGUAR=- (30 Марта 2012 в 06:10)
А вот у меня вопрос а можно к примеру mysql_fetch_object как нить присвоить своё имя к примеру sql_object
---------------
31. MrDeath (8 Апр 2012 в 18:08)
LVC2 , а почему ты не написал в статье о функциях execute и prepare? насколько мне известно именно execute И prepare защищает от инъекции...
возьмём к примеру
$a = DB::$dbh->query("insert into tra set tra = ?",array($tra));
echo "$a";
а не лучше:
$a = "INSERT INTO tra SET tra = ?";
$b = DB::$dbh->prepare($a);
$c = array (? => $name);
DB::$dbh->execute($c);
или я ошибаюсь? и я не видел защиты в гетах от url sql inj т.е он становится уязвим?
Изм: MrDeath (09.04 в 16:15) [1]
---------------
32. LVC2 (9 Апр 2012 в 14:48)
MrDeath , потому что тут используется готовый класс, поэтому prepare и execute тут и не описывались...
---------------
33. GOAST (9 Апр 2012 в 14:50)
зачем это?
---------------
34. MrDeath (9 Апр 2012 в 16:16)
LVC2, ага чёт я тупанул, но по любому GET-ы и POST-ы нужно фильртовать ибо к URL SQL INJ это никак не относится!
GOAST, читай пост 1, быстрый класс работы с бд
---------------
35. Artas (9 Апр 2012 в 20:56)
Вообще на PDO надо переходить изза того что в ближайшиз версиях PHP функции mysql_ будут выдавать notice как deprecated а с PHP 6 уже undefined function mysql_*()
---------------
36. LVC2 (19 Апр 2012 в 09:33)
MrDeath , фильтровать нужно всегда, а сам PDO будет как доп. модуль в безопасности)
---------------
37. whitenigger (23 Апр 2012 в 15:39)
Такс товарищи помогайте. Почитал конечно но так и не понял как все таки работать с PDO без класса. Безопасна ли данная конструкция с точки зрения SQL инъекции:
$result = $db->prepare("INSERT INTO `user` (login,password) VALUES (:login,:password)");
$result->execute(array(':login'=>$login, ':password'=>$password));
---------------
38. LVC2 (23 Апр 2012 в 15:51)
whitenigger , собственно через класс идет то же самое, только в более компакстном и красивом виде! а так это аналогично тому что идет и через готовый класс!
---------------
39. whitenigger (23 Апр 2012 в 16:04)
LVC2 , ага спс. Тока я все равно не вижу смысла в использовании класса )) вроде и без него тогда все просто и понятно.
---------------
40. LVC2 (3 Июня 2012 в 19:10)
whitenigger , ну это уже кому как.
---------------
41. S3ON1K (3 Июня 2012 в 23:26)
чем это PDO превосходит mysql ?!
---------------
42. MrDeath (3 Июня 2012 в 23:28)
Цитата: S3ON1K[03.06 в 23:28] чем это PDO превосходит mysql ?!...
Ответ: Всем)
смотри пост 1
---------------
43. S3ON1K (4 Июня 2012 в 00:14)
MrDeath , а что будет лучше, mysqlI или PDO ?
---------------
44. MrDeath (4 Июня 2012 в 00:15)
Цитата: S3ON1K[04.06 в 00:15] MrDeath, а что будет лучше, mysqlI или PDO ?...
Ответ: Трудно сказать, у каждой свои плюсы
---------------
45. S3ON1K (4 Июня 2012 в 00:19)
MrDeath , да я всю жизнь работал с mysql.
Потом гдето услышал что mysqli будет работать гораздо быстрее.... Теперь еще о PDO узнаю. Что выбрать, хз ...
---------------
46. MrDeath (4 Июня 2012 в 00:22)
Цитата: S3ON1K[04.06 в 00:22] MrDeath, да я всю жизнь работал с mysql.
Потом гдето услышал что mysqli будет работать гораздо быстрее.... Теперь е...
Ответ: Советаю pdo
---------------
47. Terrin (4 Июня 2012 в 18:13)
Дайте сам класс. а то в роуторе идет
DB::run() ->
а тут совсем другое
---------------
48. Mobil (5 Июня 2012 в 16:06)
И мне:)
---------------
49. Mobil (5 Июня 2012 в 16:25)
Вроде так
<?php
class dbh {
$dbh = new PDO('mysql: $host, $dbname, $user, $pass);
$dbh->exec("SET CHARACTER SET utf8");
$dbh = null;
} catch (PDOException $e) {
print "Ошибка!: " . $e->getMessage() . "<br/>";
die();
}
?>
<?php
define ('host', 'localhost');
define ('dbname', '');
define ('user', '');
define ('pass', '');
?>
А может и ошибаюсь...
Изм: Mobil (06.06 в 17:23) [1]
---------------
50. Mobil (5 Июня 2012 в 16:26)
MrDeath , Правильно?
---------------
51. MrDeath (5 Июня 2012 в 18:15)
Цитата: Mobil[05.06 в 18:15] Вроде так
<?php
class dbh {
$dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
$dbh->exec("SET CHARACTER SET u...
Ответ: А юзера и пасс ты как будешь индитифицировать? :-) так же как и dbname=, через запятую , равно - данные
---------------
52. Mobil (6 Июня 2012 в 16:54)
MrDeath , А как правильней?
---------------
53. MrDeath (6 Июня 2012 в 16:59)
да всё и так норм
---------------
54. Mobil (6 Июня 2012 в 17:21)
Цитата: MrDeath[06.06 в 17:21] да всё и так норм...
Ответ: Точно? Этот класс будет работать?
---------------
55. MrDeath (6 Июня 2012 в 17:23)
Будет)
---------------
56. Mobil (6 Июня 2012 в 17:24)
Цитата: MrDeath[06.06 в 17:24] Будет)...
Ответ: Изменил пост, так правильней да?
---------------
57. MrDeath (6 Июня 2012 в 17:26)
Цитата: Mobil[06.06 в 17:26] Изменил пост, так правильней да?...
Ответ: верни как было :-)
---------------
58. Mobil (6 Июня 2012 в 17:33)
Цитата: MrDeath[06.06 в 17:33] верни как было :-)...
Ответ: Я забыл как.лол.
Изм: Mobil (06.06 в 17:35) [1]
---------------
59. Миледи (26 Июля 2012 в 16:46)
Цитата: LVC2[26.07 в 16:46] 4) MYSQL_AFFECTED_ROWS - MYSQL_NUM_ROWS:
<?
/* тут тоже существует два способа получения данных*/
/* первый ...
Ответ: В этом случае лучше использовать код:
<?
$all = DB::$dbs->query("SELECT COUNT(*) FROM `table`");
$all = $all->fetchColumn();
?>
Иначе если считать строки твоим способом, то идет большая нагрузка. Говорю о том что если строк будет около 50 тыс, то он не будет работать... А выдаст ошибку.
---------------
60. Призрак (27 Июля 2012 в 02:26)
обновил vertrigoServ и вылезло вот ето....в чем проблема?
---------------
61. -=JAGUAR=- (31 Июля 2012 в 05:44)
Цитата: LVC2[31.07 в 05:44] 4) MYSQL_AFFECTED_ROWS - MYSQL_NUM_ROWS:
<?
/* тут тоже существует два способа получения данных*/
/* первый ...
Ответ: А как будет выглядить запрос к примеру у меня есть запрос в базу проверяет есть ли юзер в базе еси нет то фалш.как ето будет выглядить на пдо не допру чтот.код писать не стал поскокьку ша я с тела
---------------
62. LVC2 (2 Авг 2012 в 22:42)
ну можно так
<?
$user = DB::$dbh->query("SELECT * FROM users WHERE id=? LIMIT 1",array($user_id);
if($user->rowCount() == 1) true;
else false;
?>
---------------
63. LVC2 (2 Авг 2012 в 22:48)
Цитата: Миледи[02.08 в 22:48] В этом случае лучше использовать код:
<?
$all = DB::$dbs->query("SELECT COUNT(*) FROM `table`");
$all = $all->fetchColumn()...
Ответ: 1) как ты на этом построишь тот же цикл?
$count = count($count);
это подходит для цикла foreach т.к. используется fetchAll()
$count = $count->rowCount() для любого цикла пойдет
2) то что ты написала в моем примере используется проще:
<?php
$count = DB::$dbh->querySingle("SELECT COUNT(*) FROM table");
?>
---------------