Возникло пару вопросов.
Драйвер должен состоять всего из 4-х ф-й : select, insert, update, delete. Логика их работы не имеет значения. Вызов просто $this->db->select(); в чем и профит.
У PDO есть ф-я query() которая просто для select и возвращает стейтмент, который можно потом fetch(). А что если в селекте есть параметры? Их же надо экранировать. Использовать sprintf() в связке с mysql_real_string когда речь идет о PDO не кошерно.
Сначала я написал ф-ю
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().
Хорошо, можно переписать мою ф-ю иначе:
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() но снова - как тогда быть с параметрами?