Все о 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"); ?> ---------------