Возникло пару вопросов.
Драйвер должен состоять всего из 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
Там есть где то в центре пост Было: - Стало: Откройте посмотрите.
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 )
Есть у стейтмента, действительно.
Теперь есть все, что нужно. Тема закрыта.
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
ИМХО! А тебе и не надо до него добираться. Тут достаточно только вызвать метод из класса. |
Я в курсе теперь.
Просто упустил, что такой метод вообще есть.