Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Классы


Автор: crow 20.8.2007, 13:30
привет всем, такая трабла, пишу класс для замещения стандартного механизма сессий, ну чтобы инфа о сессиях была в mysql...

так вот, при вызове или создании класса для работы с БД пишет Fatal error: Using $this when not in object context

вот пример одной из функций:

Код

function sess_open($save_path, $session_name)
    {
        $this->db = new database();
     return true;
    }



в чем дело не пойму... 
сделал по другому:

Код

function sess_open($save_path, $session_name)
    {
        global $DB;
        $DB = new database();
     return true;
    }


а так пашет.... 

собственно вопрос, почему в первом случае пишет ошибку??? smile 

Автор: Mal Hack 20.8.2007, 13:34
Всю имплементацию класса покажите, пожалкйста.
Скорее всего ошибка в том, что вы функцию объявляете вне зоны имплементации класса.

Автор: crow 20.8.2007, 13:51
Mal Hack, 

Код

class SessionHandler
  {
    protected $table = '#__session';
    protected $db = NULL;

    function __construct()
    {
      return true;
    }


    function sess_open($save_path, $session_name)
    {
        $this->db = new database();
     return true;
    }

    function sess_close()
    {
      if ( is_resource($this->db) )
      {
        $this->db = NULL;
        return true;
      }
      else
      {
        return false;
      }
    }

    // Чтение сессии
    function sess_read($id)
    {
      $microtime = time()+600;
      // get session data:
      $this->db->setQuery("SELECT ses_data
                           FROM $this->table
                           WHERE ses_key = '$id' AND ses_time <= '$microtime'");
      $this->db->query();
      return $this->db->loadResult();
    }

    // Запись сесси
    function sess_write($id, $sess_data)
    {
    $microtime = time()+600;
    $this->db->setQuery("SELECT id
                         FROM $this->table
                         WHERE ses_key = '$id' AND ses_time <= '$microtime'");
    $this->db->query();

    if ( $DB->loadNumRows() )
    {
      // session exists: update
      $session_id = $this->db->loadResult();
      $data = array( 'ses_data'=>mysql_escape_string($sess_data),'ses_time'=>time() );
      $this->db->updateData($this->table,$data,$session_id);
    }
    else
    {
      // session does not exist: insert
      $data = array( '',$id,time(),mysql_escape_string($sess_data),'' );
      $this->db->insertData($this->table,$data);
    }
    return true;
    }

    // Уничтожение сессии
    function sess_destroy($id)
    {
      $this->db->deleteData( $this->table ,null,array('ses_key'=>$id) );
      return true;
    }


    function sess_gc($maxlifetime)
    {
      // invalidate any sessions older than $maxlifetime seconds old
      $sql = "
        DELETE
        FROM
          $this->table
        WHERE
          ses_time < DATE_ADD(time(), INTERVAL -$maxlifetime SECOND)
      ";
      $gcQ = mysql_query($sql, $this->db) or die("Garbage collection query failed");
      return true;
    }
  }

  session_set_save_handler(
    array("SessionHandler", "sess_open"),
    array("SessionHandler", "sess_close"),
    array("SessionHandler", "sess_read"),
    array("SessionHandler", "sess_write"),
    array("SessionHandler", "sess_destroy"),
    array("SessionHandler", "sess_gc")
  ) or die("Failed to register session handler");

  $session = new SessionHandler();
  session_start();




вот, класс для управления БД инклюдится в основном файле(к примеру Index.php) перед этим файлом...

вроде все ок, тока еще одна ошибка есть, в начале класса сессий объявляю 
Код

protected $table = '#__session';

Но при вызове этой переменной в запросах 
Код

$this->db->setQuery("SELECT ses_data
                           FROM $this->table
                           WHERE ses_key = '$id' AND ses_time <= '$microtime'");


пишет ту же ошибку - Fatal error: Using $this when not in object context ......
 где собака зарыта???  smile 

Автор: Mal Hack 20.8.2007, 13:56
Цитата(crow @  20.8.2007,  13:51 Найти цитируемый пост)
пишет ту же ошибку - Fatal error: Using $this when not in object context ......

Так объектные переменные не вставляются в строки... {} или ".." используется.
После объявления класса ; поставьте.

Автор: crow 20.8.2007, 14:03
Цитата(Mal Hack @ 20.8.2007,  13:56)
Так объектные переменные не вставляются в строки... {} или ".." используется.
После объявления класса ; поставьте.

эт как??? можно примерчик маленьки??

Автор: Mal Hack 20.8.2007, 14:08
В самом низу: http://board.mal-hack.net/lofiversion/index.php/t243.html

Автор: GiV 20.8.2007, 14:15
Код

"SELECT ses_data
                           FROM $this->table
                           WHERE ses_key = '$id' AND ses_time <= '$microtime'"


на

Код

"SELECT ses_data
                           FROM {$this->table}
                           WHERE ses_key = '$id' AND ses_time <= '$microtime'"


или
Код

"SELECT ses_data
                           FROM " . $this->table . "
                           WHERE ses_key = '$id' AND ses_time <= '$microtime'"


Дальше по аналогии.

Автор: crow 20.8.2007, 14:16
Mal Hack, 
хм, ну ладно, допустим со строками разобрались....

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

Автор: Mal Hack 20.8.2007, 14:19
crow, 
Цитата(Mal Hack @  20.8.2007,  13:56 Найти цитируемый пост)
После объявления класса ; поставьте. 

А вообще, error_reporting(E_ALL);
кажется мне, что это не причина, а следствие.

Автор: crow 20.8.2007, 14:23
Цитата(Mal Hack @ 20.8.2007,  14:19)
crow, 
Цитата(Mal Hack @  20.8.2007,  13:56 Найти цитируемый пост)
После объявления класса ; поставьте. 

А вообще, error_reporting(E_ALL);
кажется мне, что это не причина, а следствие.

еси чесна, то не въхал (сорри что такой не понятливый)
так вроде как не правильно:
Код

class SessionHandler ;
{
}

так тоже....
Код

class SessionHandler
{
};


ПЫ.СЫ.
а при чем тут error_reporting(E_ALL); ???
кстати вот ошибки которые пишет:

Fatal error: Using $this when not in object context in w:\home\test1.ru\www\lib\session_c.php on line 14

Fatal error: Using $this when not in object context in w:\home\test1.ru\www\lib\session_c.php on line 20

Автор: GiV 20.8.2007, 14:28
Объект класса то создан?

Автор: Mal Hack 20.8.2007, 14:35
Покажи код создания объекта и вызова всего, чего надо.

Автор: crow 20.8.2007, 14:36
GiV, а как же без этого??? в 5 пхп без создания объекта класса сам класс выполняться не будет....

строка 14 - создания объекта класса базы данных,
строка 100 - создаем объект сессий...

Автор: GiV 20.8.2007, 14:37
Ну да, он не создан....

1.        $this->db = new database(); в конструктор вынести
2. 
Код

  session_set_save_handler(
    array("SessionHandler", "sess_open"),
    array("SessionHandler", "sess_close"),
    array("SessionHandler", "sess_read"),
    array("SessionHandler", "sess_write"),
    array("SessionHandler", "sess_destroy"),
    array("SessionHandler", "sess_gc")
  ) or die("Failed to register session handler");
  $session = new SessionHandler();


Поменять на
Код

$session = new SessionHandler();

  session_set_save_handler(
    array($session, "sess_open"),
    array($session, "sess_close"),
    array($session, "sess_read"),
    array($session, "sess_write"),
    array($session, "sess_destroy"),
    array($session, "sess_gc")
  ) or die("Failed to register session handler");


Единственное что в PHP 4 так
Код

    array(&$session, "sess_open"),
    array(&$session, "sess_close"),
    array(&$session, "sess_read"),
    array(&$session, "sess_write"),
    array(&$session, "sess_destroy"),
    array(&$session, "sess_gc")

Автор: crow 20.8.2007, 14:43
Цитата(GiV @ 20.8.2007,  14:37)
Ну да, он не создан....

1.        $this->db = new database(); в конструктор вынести
2. 
Код

  session_set_save_handler(
    array("SessionHandler", "sess_open"),
    array("SessionHandler", "sess_close"),
    array("SessionHandler", "sess_read"),
    array("SessionHandler", "sess_write"),
    array("SessionHandler", "sess_destroy"),
    array("SessionHandler", "sess_gc")
  ) or die("Failed to register session handler");
  $session = new SessionHandler();


Поменять на
Код

$session = new SessionHandler();

  session_set_save_handler(
    array($session, "sess_open"),
    array($session, "sess_close"),
    array($session, "sess_read"),
    array($session, "sess_write"),
    array($session, "sess_destroy"),
    array($session, "sess_gc")
  ) or die("Failed to register session handler");


Единственное что в PHP 4 так
Код

    array(&$session, "sess_open"),
    array(&$session, "sess_close"),
    array(&$session, "sess_read"),
    array(&$session, "sess_write"),
    array(&$session, "sess_destroy"),
    array(&$session, "sess_gc")

сенкс, ща попробую....

ПЫ.СЫ. я кодю на ПХП 5...  так что ссылки на $session можно не писать... )))

Добавлено через 6 минут и 17 секунд
GiV, хм...... вот ента да......

СПС ОГРОМНЫЙ!!! Все заработало!! )))  smile 

Автор: crow 20.8.2007, 15:00
кстати в запросах $this->table не трогал, и все пашет, запросы проходят....

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