Дипломник - Репутация: 2
- Webmoney BL: ?
| Всем привет! В процессе написания кода обнаружилась одна странность. Если работать с MySQL, то вполне спокойно работает такой код:
PHP код: class SQL { public function query($text) { $this->a = mysql_query($text); return $a; }
public function read() { if (!is_resource($this->a)) return false;
return mysql_fetch_array($this->a); } }
Т.е. при условии что идёт выборка SELECT и она правильная, в одной функции можно было сделать запрос, в другой - его проанализировать. Если повторить тоже самое с PDO, возникает ощущение, что PDOStatement просто обнуляется. Как будто бы PHP "не помнит" результаты запроса от функции к функции. Хотя они сохраняются в переменной класса и она имеет тип PDOStatement. В PDO имеем вот такую функцию запроса:
PHP код: public static function query($text) { if (empty($text)) { $text = Db::$query; } if (!is_object(DB_PDO_MySQL::$pdo)) throw new Exception("PDO connect was unsuccessful"); self::$query_id = DB_PDO_MySQL::$pdo->query($text); return self::$query_id; }
а в fetch:
PHP код: public static function fetch() { if (!is_object(DB_PDO_MySQL::$query_id)) throw new Exception("Cannot analyze non-object variable"); $cnt = DB_PDO_MySQL::getRowCount(); $pdo_statement = DB_PDO_MySQL::$query_id; for ($i = 0; $i < $cnt; $i++) { $dbr = $pdo_statement->fetch(); yield $dbr; }
Как бы ничего не выдаёт. Точнее выдаёт.... на запрос
PHP код: print_r(DB_PDO_MySQL::getTables());
PHP код: public static function getTables($dbname = '') { if(empty($dbname)) $dbname = Db::$connection_data['dbname']; if (!DB_PDO_MySQL::dbExists($dbname)) throw new Exception("Database $dbname does not exist"); $str = 'SHOW TABLES FROM ' . $dbname; $q = DB_PDO_MySQL::query($str); $var = 'Tables_in_'.$dbname; $tables = array(); foreach (DB_PDO_MySQL::fetch() as $value) $tables[] = $value; echo $value; return $tables; }
выдаёт пустой массив из 7 элементов. Я этой функцией запрашиваю список таблиц в базе - их 7. Однако имена не выдаются. Я понимаю, что если использовать нативную функцию PDOStatement->fetch() то всё отлично. Но мне хотелось именно раскидать это по двум методам. Извините если сумбурно написал, задавайте вопросы, поясню, что к чему. |