Проблема с on a non-object

Статус
В этой теме нельзя размещать новые ответы.

Gameer

Постоялец
Регистрация
25 Апр 2014
Сообщения
187
Реакции
118
Всем доброй ночи кто еще не спит, и утра или дня кто проснулся. Появилась проблема с запросом в Базу данных, точнее использования fetch_array. Но если прописать
PHP:
mysqli_fetch_array($this->sql_query, MYSQLI_ASSOC);
то все хорошо. Проблема в том что до этого ошибки не было, использовал код и все было хорошо, а тут вдруг и не могу понять в чем проблема. Хоть и понимаю что за ошибка. В классе базы данных 168 строка.

Создается экземпляр класса :
PHP:
$this->db = BASE_DB::SET_BASE_DB(DBHOST, DBUSER, DBPASS, DBNAME);

Сам запрос :
Код:
$sql = $this->db->RETURN_ARRAY("SELECT
                      st.id AS comm_id, st.name_static, st.user_id AS comm_user_id, st.date AS comm_date, st.author,
                       st.email AS comm_email, st.text, st.ip, st.is_register, st.rating, st.vote_num,
                       u.name, u.email AS user_email, u.news_num, u.comm_num, u.user_group, u.lastdate, u.reg_date,
                       u.signature, u.foto, u.fullname, u.land, u.xfields
                     FROM
                        static_comm AS st, " . PREFIX . "_users AS u
                     WHERE
                         st.user_id=u.user_id AND name_static={?}
                     ORDER BY {?}
                     DESC LIMIT {?},{?}",
                     array($this->id_static, 'id', $this->cstartlimit, $this->searchcount),
                     MYSQLI_ASSOC
                  );
Сам класс Базы данных :
PHP:
<?php
/*
=============================================================================
Kawaii SM 2016 (c)
=============================================================================
Автор : Gameer
-----------------------------------------------------
URL: http://igameer.ru/
=============================================================================
Файл:  base.php
=============================================================================
Версия файла : .1 Stable Release
=============================================================================
/*
* Назначение:
* - Соединение с базой данных.
*/

CLASS BASE_DB
{

    private static $db = FALSE;    // Экземпляр класса
    private $mysqli_base;         // Наша база
    private $rep_symb = "{?}";     // Символ для парсинга
    private $sql_query = FALSE;    // Идентификатор результата запроса
  
    /*
    * Получение экземпляра класса.
    * Если экземпляр уже существует то возвращается в противном случае создаётся.
    */
    STATIC FUNCTION SET_BASE_DB($host, $user, $pass, $db_name)
    {
        if (self::$db == FALSE) self::$db = NEW BASE_DB($host, $user, $pass, $db_name);
        return self::$db;
    }

    /*
    * Конструктор который устанавливает связь с Базой Данных и задает Кодировку.
    *
    */
    PRIVATE FUNCTION __construct($host, $user, $pass, $db_name)
    {
        $host = EXPLODE(":", $host);
        if (isset($host[1]))
            $this->mysqli_base = @new mysqli($host[0], $user, $pass, $db_name, $host[1]);
        else
            $this->mysqli_base = @new mysqli($host[0], $user, $pass, $db_name);
      
        if ($this->mysqli_base->connect_error) {
            die( 'Ошибка подключения! Код : ' . $this->mysqli_base->connect_errno . '. Причина : ' . $this->mysqli_base->connect_error);
        }
      
        $this->mysqli_base->query("SET NAMES 'utf8'");
    }

    /*
    * Функция REPLACE_PARAM которая заменит символ на значение которое проходит через real_escape_string.
    *
    * @param $query     - запрос
    * @param $params     - параметры (не обязательно)
    * @return Запрос
    */
    FUNCTION REPLACE_PARAM($query, $params)
    {
        if ($params) {
            for ($i = 0; $i < count($params); $i++)
            {
                $pos = strpos($query, $this->rep_symb);
                $arg = "'".$this->mysqli_base->real_escape_string($params[$i])."'";
                $query = substr_replace($query, $arg, $pos, strlen($this->rep_symb));
            }
        }
        return $query;
    }

    /*
    * Функция для SELECT которая вернет таблицу результатов.
    *
    * @param $query     - запрос
    * @param $params     - параметры (не обязательно)
    * @return Данные OR FALSE
    */
    FUNCTION SELECT($query, $params = FALSE)
    {
        $this->sql_query = $this->mysqli_base->query($this->REPLACE_PARAM($query, $params));
        if (!$this->sql_query) return FALSE;
        $rows = array();
        while (($row = $this->sql_query->fetch_assoc()) != FALSE)
        {
          $rows[] = $row;
        }
      
        $this->FREE();
        return $rows;
    }

    /*
    * Функция для SELECT которая вернет только одну строку.
    *
    * @param $query     - запрос
    * @param $params     - параметры (не обязательно)
    * @return Данные OR FALSE
    */
    FUNCTION SELECT_ONE($query, $params = FALSE)
    {
        $this->sql_query = $this->mysqli_base->query($this->REPLACE_PARAM($query, $params));
        $sql_res = ($this->sql_query->num_rows != 1) ? FALSE : $this->sql_query->fetch_assoc();
        $this->FREE();
        return ($sql_res === FALSE) ? FALSE : $sql_res;
    }

    /*
    * Функция для запросов кроме SELECT. В случае запроса INSERT вернет последний AUTO_INCREMENT
    *
    * @param $query     - запрос
    * @param $params     - параметры (не обязательно)
    * @return LAST INSERT ID OR TRUE/FALSE
    */
    FUNCTION QUERY($query, $params = FALSE)
    {
        $this->sql_query = $this->mysqli_base->query($this->REPLACE_PARAM($query, $params));
        if ($this->sql_query)     return ($this->mysqli_base->insert_id > 0) ? $this->mysqli_base->insert_id : true;
        else                     return FALSE;
    }
  
    /*
    * Функция для экранизации специальных символов в строке для использования в SQL выражении.
    *
    * @param $query     - строка
    * @return Данные
    */
    FUNCTION SAFE($query = FALSE)
    {
        if($this->mysqli_base AND $query)
        {
            if(is_array($query))
            {    for($i = 0; $i < count($query); $i++)
                {
                    $query[$i] = $this->mysqli_base->real_escape_string($query[$i]);
                }
                return $query;
            }
            else
                return $this->mysqli_base->real_escape_string($query);
        }
    }
  
    /*
    * Функция для получения числа строк, затронутых предыдущей операцией MySQL.
    *
    * @return Число строк
    */
    FUNCTION RET_AFF_ROWS()
    {
        if($this->mysqli_base) return $this->mysqli_base->affected_rows;
    }
  
    /*
    * Функция RETURN_ARRAY помещает строку в массив
    *
    * @param $query     - запрос
    * @param $params     - параметры (не обязательно)
    * @param $sql_tipe     - Значение константы
    */
    FUNCTION RETURN_ARRAY ($query, $params = FALSE, $sql_tipe = MYSQLI_ASSOC)
    {
        $this->sql_query = $this->mysqli_base->query($this->REPLACE_PARAM($this->SAFE($query), $this->SAFE($params)));
        $sql_res = $this->sql_query->fetch_array(MYSQLI_ASSOC);
        return $sql_res;
    }
  
    /*
    * Функция NUM_ROWS возвращает количество строк
    *
    * @return Количество строк
    */
    FUNCTION NUM_ROWS ($sql_quer = FALSE)
    {
        if(!$sql_quer) $sql_quer = $this->sql_query;
        return $sql_quer->num_rows;
    }
  
    /*
    * Функция FREE освобождает память занятую результатами запроса
    *
    * @param $sql_quer     - Идентификатор результата запроса
    */
    FUNCTION FREE($sql_quer = FALSE)
    {
        if(!$sql_quer) $sql_quer = $this->sql_query;
        $sql_quer->free_result;
    }
  
    /*
    * Функция CLOSE для закрытия соединения с базой
    */
    FUNCTION CLOSE()
    {
        @$this->mysqli_base->close();
        $this->db = FALSE;
    }
}
?>
 
Проблема решена. Все дело было в том что не нужно мне было использовать REPLACE_PARAM функцию на параметры что идут в ORDER и LIMIT.
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху