Правила     Закладки     Карма    Календарь    Журналы    Помощь    Поиск    PDA    Чат   
        СМС-ки
   
Пейджер выключен!
 
Фильтр авторов:    показать 
  скрыть
  Ответ в темуСоздание новой темыСоздание опроса

> PDO и rowCount();
VladKamyshanov  
 ۩  [x] Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Старик
***

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 100
Пользователь №: 33005
На форуме: 4 года, 4 месяца, 23 дня
Карма: 3




По мере того, как пишу обёртку для PDO(драйвер MySQL) возникли проблемы. Для начала весь класс обёртки.

Свернутый текст
class Database {

// Экземпляр класса
private static $instance;
// Дескрипторы
private $pdo = array();
// Prepared Statement обьект
private $stmt;
// Текущее соединение
private $nowConnection;

// Нельзя создать экземпляр класса через конструктор
private function __construct() {

}


// Получение экземпляра только через метод instance()
public static function instance() {
if (empty(self::$instance)) {
self::$instance = new self;
}
return self::$instance;
}

// Добавление нового соединения
public function addConnection($host, $db, $user, $pass, $id, $port = false, $charset = "utf8") {
try {
// Определяем порт
if (!$port)
$port = ini_get("mysql.default_port");
// Драйвер
$dsn = "mysql:";
// Хост
$dsn .= "host={$host};";
// Порт
$dsn .= "port={$port};";
// База данных
$dsn .= "dbname={$db};";
// Кодировка
$options = array(
PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES {$charset}",
);

if (!isset($this->pdo[$id])) {
// Если ещё не подключены к базе - подключаемся
$this->pdo[$id] = new PDO($dsn, $user, $pass, $options);
$this->pdo[$id]->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
}
// И устанавливаем как текущее соединение
$this->switchConnection($id);
} catch (PDOException $e) {
// В случае ошибки - бросам исключение
throw new DatabaseExeption("[Database.php]Error in switchConnection(): " . $e->getMessage());
}
}


// Переключает активное соединение
public function switchConnection($id) {
if (isset($this->pdo[$id])) {
// Устанавливаем соединение $id как текущее
$this->nowConnection = &$this->pdo[$id];
} else {
// В случае, если нет соединение $id - бросаем исключение
throw new DatabaseExeption("[Database.php]Error in switchConnection(): There is no connections called {$id}");
}
}


// Запрос к базе данных
public function query() {
// Получаем аргументы
$args = func_get_args();
// Первый аргумент - шаблон
$query = array_shift($args);
try {
// Если запрос не требует prepared statement - вызов simplyQuery
if (empty($args))
$this->simplyQuery($query);
// Если аргументы для placeholders переданны как массив - вызываем stmtQuery() с передачей массива
elseif (is_array($args[0]))
$this->stmtQuery($query, $args[0]);
// Иначе собираем аргументы в массив самостоятельно и вызываем stmtQuery()
else
$this->stmtQuery($query, $args);
} catch (PDOException $e) {
// В случае ошибки - бросам исключение
throw new DatabaseExeption("[Database.php]Error in query: " . $e->getMessage());
}
}


// Запрос, не требующий prepared statement
private function simplyQuery($query) {
// Просто выполняем запрос
$this->stmt = $this->nowConnection->query($query);
}

// Запрос, требующий prepared statement
private function stmtQuery($query, $args) {
// Подготавливаем запрос
$this->stmt = $this->nowConnection->prepare($query);
// Выполняем
$this->stmt->execute($args);
}

// Получение строк, затронутых запросом
public function affectedRows() {
$this->rowCount();
}

// Получение строк в результирующем наборе
public function numRows() {
$this->rowCount();
}

// Подсчёт строк после запроса
private function rowCount() {
try {
// Возвращаем rowCount()
return $this->stmt->rowCount();
} catch (PDOException $e) {
// В случе ошибки бросаем исключение
throw new DatabaseExeption("[Database.php]Error in rowCount() " . $e->getMessage());
}
}
}


Клиентский код:


try {
// Получаем экземпляр класса
$database = Database::instance();
// Подключение базе типа (хост,имя базы,пользователь,пароль,id соединения)
$database->addConnection("localhost", "application", "root", "", "application");
// Запрос к базе данных
$database->query("INSET INTO users VALUES(?,?)",null,"Spike");
// Выводим кол-во строк, затронутых запросом
echo $database->affectedRows();
} catch (DatabaseExeption $e) {
echo $e->getMessage();
}

Всё получается: и подключение, и запрос, и в базе данных строчка появляется.
Но не выводится количество затронутых строк. Это плохо. Я даже не знаю что делать. Был бы чудовищно благодарен помощи.

PS
Кол-во строк не выводится даже при SELECT запросах((
PM
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Oyeme  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Reality is wrong. Dreams are for real
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 1677
Пользователь №: 16955
На форуме: 7 лет, 9 месяцев, 13 дней
Карма: 94




From the PDO Doc:

For most databases, PDOStatement::rowCount() does not return the number of rows affected by a SELECT statement. Instead, use PDO::query() to issue a SELECT COUNT(*) statement with the same predicates as your intended SELECT statement, then use PDOStatement::fetchColumn() to retrieve the number of rows that will be returned. Your application can then perform the correct action.


--------------------
Programming: Private lessons via skype £45/h

Частные уроки в Лондоне / удаленно по skype.
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
VladKamyshanov  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Старик
***

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 100
Пользователь №: 33005
На форуме: 4 года, 4 месяца, 23 дня
Карма: 3




Цитата
From the PDO Doc:

For most databases, PDOStatement::rowCount() does not return the number of rows affected by a SELECT statement. Instead, use PDO::query() to issue a SELECT COUNT(*) statement with the same predicates as your intended SELECT statement, then use PDOStatement::fetchColumn() to retrieve the number of rows that will be returned. Your application can then perform the correct action.


Ок. Когда-то давно свойство stmt было объявлено как статическое. И при запросе self::$stmt->rowCount(); (о чудо) возвращалось нужное мне значение.
PM
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
VladKamyshanov  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Старик
***

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 100
Пользователь №: 33005
На форуме: 4 года, 4 месяца, 23 дня
Карма: 3




Цитата
Когда-то давно свойство stmt было объявлено как статическое

Просто объявлял как статическое т.к. не до конца разбирался singleton'e
unsure.gif
PM
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
  Быстрый ответ
Информация о Госте
Введите Ваше имя
Кнопки кодов
Для вставки цитаты, выделите нужный текст и
НАЖМИТЕ СЮДА
Введите сообщение
Смайлики
:huh:  :o  ;) 
:P  :D  :lol: 
B)  :rolleyes:  <_< 
:)  :angry:  :( 
:unsure:  :blink:  :ph34r: 
     
Показать всё

Опции сообщения  Включить смайлики?
 Включить подпись?
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:

Опции темы Ответ в темуСоздание новой темыСоздание опроса