Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Базы Данных > дескриптор БД mysqli


Автор: patience 4.6.2009, 03:12
Доброго времени суток.

mysqli - процедурный стиль

Класс
Код

class Query {

        // link
    private $dbLink;
...
}


Query отвечает за выполнения запросов к БД и их выдачу.
При создании в конструкторе класса свойству $dbLink устанавливается дескриптор открытого соединения с БД.

загвостка в следующем:

1) создаем объект Query
2) выполняем запрос к БД используя созданный на 1) объект
-- все хорошо до сих пор
3) выполняем ещё один запрос к БД (сразу же после предыдущего) используя тот же созданный объект на шаге 1)
конечно при этом запросе используется link ($dbLink) к БД (тот самый который был установлен при создании объекта Query)
и вот тут получаем сообщение - Warning: mysqli_insert_id() expects parameter 1 to be mysqli, null given
mysqli_insert_id() - передается тот самый $dbLink


На сервере хостера все работает без предупреждений, на локальной машине появляется сообщение.
В чем может быть дело?

Заранее благодарен за помощь.

Автор: Severyanin 4.6.2009, 06:40
А первый запрос возвращает то. что надо? Код класса и обращения к нему приведите, пожалуйста

Автор: patience 4.6.2009, 10:37
Возвращает то что надо. Как я говорил все отлично работает на сервере-хостера, на локальном хосте проблема.


Код


class Query {

    
    private $queryLink;

    
    private $dbLink;

    private $queryError;


    private $statement;

    private $hasResults;

    private $isFetchable;

    private $isBuffered = true;
    
    public function __construct($sql,$dbLink,$isUnbuffered = null) {

    
        $this->statement = $sql;        
        
        
        $this->queryLink = mysqli_query($dbLink,$sql,$isUnbuffered ? MYSQLI_USE_RESULT : MYSQLI_STORE_RESULT);
        if (!$this->queryLink) {
            $this->queryError = mysqli_error($dbLink);
            return;
        }
        

        $this->isBuffered = !$isUnbuffered;
        $this->dbLink = $dbLink;


        $this->isFetchable = isset($this->queryLink->num_rows);


        if($this->isFetchable) {
            $this->hasResults = $this->queryLink->num_rows>0;
        }

    }

    public function getInsertID() {         
        $f = strtolower($this->statement[0]);       
        if($f=='i'||$f=='r')
        return mysqli_insert_id($this->dbLink);
        return null;
    }

    public function getTotalRows() {
        if($this->queryError) {
            return null;
        }


        if($this->isFetchable) {
            $total = $this->queryLink->num_rows;
                } else {
            $total = mysqli_affected_rows($this->dbLink);
                }


        return $total > 0 ? $total : 0;
    }

...
}


к примеру
$sql - insert запрос

Код

$q = new Query($sql, $link_to_db);
$q->getTotalRows();
$q->getInsertID();

Автор: Severyanin 5.6.2009, 04:33
patience, а $link_to_db получаете заранее? В остальных методах соединение не закрываете? Что после каждого вызова метода  нходится в свойствах класса?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)