Модераторы: skyboy, MoLeX, Aliance, ksnk

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Классы, вызов класса из класса... 
:(
    Опции темы
crow
Дата 20.8.2007, 13:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 1.6.2007
Где: Россия->Кислов одск

Репутация: нет
Всего: нет



привет всем, такая трабла, пишу класс для замещения стандартного механизма сессий, ну чтобы инфа о сессиях была в 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 
PM MAIL   Вверх
Mal Hack
Дата 20.8.2007, 13:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 122
Всего: 261



Всю имплементацию класса покажите, пожалкйста.
Скорее всего ошибка в том, что вы функцию объявляете вне зоны имплементации класса.
PM ICQ   Вверх
crow
Дата 20.8.2007, 13:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 1.6.2007
Где: Россия->Кислов одск

Репутация: нет
Всего: нет



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 
PM MAIL   Вверх
Mal Hack
Дата 20.8.2007, 13:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 122
Всего: 261



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

Так объектные переменные не вставляются в строки... {} или ".." используется.
После объявления класса ; поставьте.
PM ICQ   Вверх
crow
Дата 20.8.2007, 14:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 1.6.2007
Где: Россия->Кислов одск

Репутация: нет
Всего: нет



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

эт как??? можно примерчик маленьки??
PM MAIL   Вверх
Mal Hack
Дата 20.8.2007, 14:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 122
Всего: 261



PM ICQ   Вверх
GiV
Дата 20.8.2007, 14:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 137
Регистрация: 13.7.2006
Где: rus|53

Репутация: 4
Всего: 9



Код

"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'"


Дальше по аналогии.
PM MAIL WWW ICQ   Вверх
crow
Дата 20.8.2007, 14:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 1.6.2007
Где: Россия->Кислов одск

Репутация: нет
Всего: нет



Mal Hack, 
хм, ну ладно, допустим со строками разобрались....

а как быть с первой моей проблемой??? Вроде все правильно...
Конечно можно не ломать голову а тупо сделать переменную $db глобальной, но я хочу разобраться, в чем именно ошибка, чтобы впредь таких ошибок не делать....
PM MAIL   Вверх
Mal Hack
Дата 20.8.2007, 14:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 122
Всего: 261



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

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

Это сообщение отредактировал(а) Mal Hack - 20.8.2007, 14:21
PM ICQ   Вверх
crow
Дата 20.8.2007, 14:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 1.6.2007
Где: Россия->Кислов одск

Репутация: нет
Всего: нет



Цитата(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

Это сообщение отредактировал(а) crow - 20.8.2007, 14:26
PM MAIL   Вверх
GiV
Дата 20.8.2007, 14:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 137
Регистрация: 13.7.2006
Где: rus|53

Репутация: 4
Всего: 9



Объект класса то создан?
PM MAIL WWW ICQ   Вверх
Mal Hack
Дата 20.8.2007, 14:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 122
Всего: 261



Покажи код создания объекта и вызова всего, чего надо.
PM ICQ   Вверх
crow
Дата 20.8.2007, 14:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 1.6.2007
Где: Россия->Кислов одск

Репутация: нет
Всего: нет



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

строка 14 - создания объекта класса базы данных,
строка 100 - создаем объект сессий...
PM MAIL   Вверх
GiV
Дата 20.8.2007, 14:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 137
Регистрация: 13.7.2006
Где: rus|53

Репутация: 4
Всего: 9



Ну да, он не создан....

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")

PM MAIL WWW ICQ   Вверх
crow
Дата 20.8.2007, 14:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 1.6.2007
Где: Россия->Кислов одск

Репутация: нет
Всего: нет



Цитата(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 
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0587 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.