Решил сделать драйвер БД через 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() но снова – как тогда быть с параметрами?