Когда вы обозреваете множество кода, вы часто удивляетесь, почему что-то было написано так как было. Особенно когда делаются дорогие запросы в базу данных, я все еще вижу вещи, которые могут и должны быть улучшены.
Метка: pdo
Третья и завершающая про PDO теоретически и PHP форумы
Вопрос, который я задал в предыдущем посте продублировал на 5 форумов. Все форумы тематические, по PHP. Зачем я это сделал?
- Найти ответы.
- Проверить эти форумы на активность и юзабельность.
В итоге ответы нашел сам, в чужом коде. А о форумах выводы сделал.
Ответы были крайне просты. Надо было мне внимательнее читать документацию. Последний ид оказался свойством самого класса PDO.
http://ru.php.net/manual/ru/pdo.lastinsertid.php
А кол-во последних измененных строк получаются по методу стейтмента
http://ru.php.net/manual/ru/pdostatement.rowcount.php
Теперь о форумах:
http://www.php.ru/forum/ – не получил ответа. вообще никакого ответа, т.е. низкая активность?
http://phpclub.ru – сначала пытаются троллить, вместо диалога, потом наводками. в итоге ответ написал я сам. так же не понравился дизайн, добавление ответа через аякс.
хотя позже диалог завязался, подтянулись участники, меняю мнение.
Форум Школы Программирования – мертвый.
http://phpforum.ru – тут то и увидел код, натолкнувший на ответ. понравилось у них, особенно дизайн.
http://pyha.ru/forum/ – наверное зе бест. и дизайном и атмосферой. чего только стоит оценка ответов – ХУЙНЯ, а форум новичков назван “для идиотов”
В итоге я смогу закончить работу над своим драйвером и использовать его постоянно в ядре сайтов.
Драйвер БД через PDO
Решил сделать драйвер БД через PDO. С mydql напрямую все просто и однозначно, но не с PDO.
Возникло пару вопросов.
Драйвер должен состоять всего из 4-х ф-й : select, insert, update, delete. Логика их работы не имеет значения. Вызов просто $this->db->select(); в чем и профит.
У PDO есть ф-я query() которая просто для select и возвращает стейтмент, который можно потом fetch(). А что если в селекте есть параметры? Их же надо экранировать. Использовать sprintf() в связке с mysql_real_escape_string() когда речь идет о PDO не кошерно.
Сначала я написал ф-ю
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
<? public function Select($query) { try { $stmt = M_PdoDB::query($query); $result_rows = array(); while ($row = $stmt->fetch()) { $result_rows[] = $row; } return $result_rows; } catch (PDOException $e) { echo $e; return false; } } ?> |
И завис. Как же быть с параметрами? Для экранирования в PDO используется ф-я prepare(), куда передается sql запрос с параметрами WHERE например ‘id = :id ‘. Далее делаем bindParam(‘:id’, $my_id); и выполняем execute().
Хорошо, можно переписать мою ф-ю иначе:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<? public function Select($query, $param = array()) { try { $stmt = M_PdoDB::prepare($query); if ($param) { foreach ($param as $k => &$v) { $stmt->bindParam(':' . $k, $v); } } $stmt->execute(); ?> |
Но тогда надо помнить всегда про PDO, передавать sql в формате типа ‘:id’ и параметры array( “id” => $id);
Есть ли какое-то более элегантное решение?
И что делать с запросами Insert и Update где я хочу узнать кол-во измененных столбцов? execute() возвращает true или false.
Можно использовать exec() но снова – как тогда быть с параметрами?
PHP PDO. Краткое руководство
Автор 27 Апрель 2011 | Дмитрий Андреев, собственно я спер у него.
На днях решил разобраться с php PDO. Это интересно и необходимо изучать новые технологии. Русской документации нигде не нашел, потому и решил выложить. Надеюсь эта статья будет Вам интересна.