[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: PDO и rowCount();
VladKamyshanov
По мере того, как пишу обёртку для 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 запросах((



Спустя 1 час, 30 минут, 54 секунды (14.08.2012 - 22:31) Oyeme написал(а):
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.

Спустя 18 минут, 5 секунд (14.08.2012 - 22:49) VladKamyshanov написал(а):
Цитата
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(); (о чудо) возвращалось нужное мне значение.

Спустя 1 минута, 38 секунд (14.08.2012 - 22:51) VladKamyshanov написал(а):
Цитата
Когда-то давно свойство stmt было объявлено как статическое

Просто объявлял как статическое т.к. не до конца разбирался singleton'e
unsure.gif
Быстрый ответ:

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