Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Проблемы с классом для MySQL
 
 автор: azazel   (18.11.2008 в 14:24)   письмо автору
 
 

использую класс для работы с 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>';

  Ответить  
 
 автор: mechanic   (18.11.2008 в 14:43)   письмо автору
 
   для: 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...
}

  Ответить  
 
 автор: Root   (18.11.2008 в 14:51)   письмо автору
 
   для: mechanic   (18.11.2008 в 14:43)
 

>надо делать $q = new Db; $q->Query($sql); для каждого запроса

для каждого запроса новое соединение?


>а если по-отцовски, то result в основном классе не надо хранить, из него надо делать объект и возвращать

а я бы не советовал так.

  Ответить  
 
 автор: mechanic   (18.11.2008 в 16:13)   письмо автору
 
   для: Root   (18.11.2008 в 14:51)
 

>для каждого запроса новое соединение?
каков класс, такие и танцы

>а я бы не советовал так.
а мне очень удобно

$db = new db; //mysqldb, pgdb, odbcdb, sqlitedb...
$res = $db->query($sql);
while($row = $res->fetch()) {
    //...
}

еще неплохо было бы аргументировать свои советы

  Ответить  
 
 автор: Root   (18.11.2008 в 17:41)   письмо автору
 
   для: 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..

  Ответить  
 
 автор: mechanic   (19.11.2008 в 08:15)   письмо автору
 
   для: Root   (18.11.2008 в 17:41)
 

db и dbresult абстрактные..
для каждой БД наследуется конкретный db и dbresult

впрочем, полагаю что автору помог ваш ответ с видоизменением метода fetch, я же исходил из неприкосновенности класса, видимо мы действительно по-разному танцуем )

  Ответить  
 
 автор: Root   (18.11.2008 в 14:44)   письмо автору
 
   для: 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 )){
    ...
    }

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования