|
|
|
| использую класс для работы с MySQL другого разработчика
возник вопрос КАК ?
Код
class Db {
...
function Query($sql, $vars='', $safe = false)
{ ;
$this->_result = mysql_query($query, $this->_conn);
if ($this->_result) {
$this->_total++;
return $this->_result;
} else {
if ($this->getErrorMessage()) {
$this->setError($sql);
}
return false;
}
}
function getFetchArray() {
return mysql_fetch_array($this->_result);
}
function getFetchAssoc() {
return mysql_fetch_assoc($this->_result);
}
...
}
|
Проблемы с повторной выборкой из базы
один перекрывает другую
как передать указатель на результат запроса чтобы запросы не перекрывались ?
Код
$sql = 'SELECT * FROM `cat` WHERE `cat_root_id` = 0 ';
$this->_db->Query($sql);
while($var = $this->_db->getFetchAssoc()){
echo $var['cat_name'].'<br>';
$sql1 = 'SELECT * FROM `cat` WHERE `cat_root_id` = '.$var['cat_id'].' ';
$this->_db->Query($sql1);
while($var1 = $this->_db->getFetchAssoc()){
echo '---'.$var1['cat_name'].'<br>';
|
| |
|
|
|
|
|
|
|
для: azazel
(18.11.2008 в 14:24)
| | для нормального использования приведенного класса надо делать $q = new Db; $q->Query($sql); для каждого запроса
а если по-отцовски, то result в основном классе не надо хранить, из него надо делать объект и возвращать
типа так
class db {
//тут коннекты, дисконнекты, дампы, ресторы, селектДБ и прочее...
function query($sql) {
return new DbResult(mysql_query($sql));
}
}
class DbResult {
protected $result;
function __construct($res) {
$this->result = $res;
}
//а вот тут fetch, affected_rows, free_result etc...
}
|
| |
|
|
|
|
|
|
|
для: mechanic
(18.11.2008 в 14:43)
| | >надо делать $q = new Db; $q->Query($sql); для каждого запроса
для каждого запроса новое соединение?
>а если по-отцовски, то result в основном классе не надо хранить, из него надо делать объект и возвращать
а я бы не советовал так. | |
|
|
|
|
|
|
|
для: Root
(18.11.2008 в 14:51)
| | >для каждого запроса новое соединение?
каков класс, такие и танцы
>а я бы не советовал так.
а мне очень удобно
$db = new db; //mysqldb, pgdb, odbcdb, sqlitedb...
$res = $db->query($sql);
while($row = $res->fetch()) {
//...
}
|
еще неплохо было бы аргументировать свои советы | |
|
|
|
|
|
|
|
для: mechanic
(18.11.2008 в 16:13)
| | >каков класс, такие и танцы
Мы с Вами по-разному танцуем.
Посмотрите пост "автор: Root (18.11.2008 в 14:44)". Это альтернатива Вашим соединениям для каждого нового запроса.
>еще неплохо было бы аргументировать свои советы
Вы пердлагаете в классе DbResult реализовать методы fetch, affected_rows, free_result etc...
В то же время Вы указываете, что работать можно с разными БД //mysqldb, pgdb, odbcdb, sqlitedb...
В этом то всё и дело.
Во-первых непонятно откуда DbResult должен знать с какой базой работаем.
Но даже если будет знать.. как Вы собираетесь реализовать к примеру простой fetch в DbResult?
Проверять какая СУБД и возвращать соответствующий
mysql_fetch_assoc
pg_fetch_assoc
oci_fetch_assoc
sqlite_fetch_array
...
и т.д?
и так для каждого метода..
Не "зажирно" ли будет для класса DbResult?
и в классе db, соответственно, может быть не только mysql_query.. | |
|
|
|
|
|
|
|
для: Root
(18.11.2008 в 17:41)
| | db и dbresult абстрактные..
для каждой БД наследуется конкретный db и dbresult
впрочем, полагаю что автору помог ваш ответ с видоизменением метода fetch, я же исходил из неприкосновенности класса, видимо мы действительно по-разному танцуем ) | |
|
|
|
|
|
|
|
для: azazel
(18.11.2008 в 14:24)
| |
<?php
function getFetchAssoc( $result = null )
{
if( !$result )
{
$result = $this->_result;
}
return $result ? @mysql_fetch_assoc( $result ) : false;
}
...
$res = $this->_db->Query($sql1);
while($var1 = $this->_db->getFetchAssoc( $res )){
...
}
|
| |
|
|
|