[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Драйвер БД через PDO
seyfer
Решил сделать драйвер БД через PDO. С mydql напрямую все просто и однозначно, но не с PDO.
Возникло пару вопросов.

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



Спустя 13 минут, 44 секунды (19.04.2012 - 09:51) m4a1fox написал(а):
seyfer
http://phpforum.ru/index.php?showtopic=59616&st=15
Там есть где то в центре пост Было: - Стало: Откройте посмотрите.

Спустя 40 минут, 2 секунды (19.04.2012 - 10:31) seyfer написал(а):
Цитата (m4a1fox @ 19.04.2012 - 07:51)
seyfer
http://phpforum.ru/index.php?showtopic=59616&st=15
Там есть где то в центре пост Было: - Стало: Откройте посмотрите.

Благодарю, интересное решение.

Однако у меня PDO реализован singleton и в драйвере не наследуется, а вызывается например

$stmt = M_PdoDB::prepare($query);

для удобства в моем M_PdoDB возвращается стейтмент, если объект еще не был создан, чтобы не вызывать даже getInstance.
Не уверен, что в этом случае смогу добраться до

return $this->lastInsertId();

Не совсем понимаю как к нему обратиться, буду пробовать.

Спустя 10 минут, 5 секунд (19.04.2012 - 10:41) seyfer написал(а):
Туплю...

string lastInsertId ([ string $name = NULL ] )

Нашел после того, как написал сообщение. Все равно благодарю.

int rowCount ( void )

Есть у стейтмента, действительно.

Теперь есть все, что нужно. Тема закрыта.

Спустя 1 минута, 53 секунды (19.04.2012 - 10:43) m4a1fox написал(а):
seyfer
Цитата
Не уверен, что в этом случае смогу добраться до

ИМХО! А тебе и не надо до него добираться. Тут достаточно только вызвать метод из класса.

Спустя 1 минута, 44 секунды (19.04.2012 - 10:45) seyfer написал(а):
Цитата (m4a1fox @ 19.04.2012 - 08:43)
seyfer
Цитата
Не уверен, что в этом случае смогу добраться до

ИМХО! А тебе и не надо до него добираться. Тут достаточно только вызвать метод из класса.

Я в курсе теперь.

Просто упустил, что такой метод вообще есть.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.