За последние 24 часа нас посетили 33229 программистов и 1755 роботов. Сейчас ищут 923 программиста ...

Call to a member function query() on a non-object

Тема в разделе "PHP для новичков", создана пользователем oligarx, 22 апр 2007.

  1. oligarx

    oligarx Активный пользователь

    С нами с:
    23 янв 2007
    Сообщения:
    68
    Симпатии:
    0
    Адрес:
    Украина Львов
    Вот и снова я. Буду надоедать вам своими вопросами.
    Снова написал немного кода и опять ошибка. Главное то, что я даже представления не имею, откуда она и как от нее избавится.
    Сразу скажу что поиском пользовался но внятного ответа не нашел. Может я его не увидел – но искал!
    Ладно, меньше болтовни перехожу к делу.
    Код такой:
    Класс БД
    PHP:
    1. <?php
    2. class db {
    3.   public  $conn_id;
    4.   private $query_id;
    5.   function connect(){
    6.     /*......*/
    7.     $this->conn_id = @mysql_connect('host', 'user', 'pass');
    8.     mysql_select_db('base');
    9.     /*......*/  
    10.   }
    11.   function query($query){
    12.     /*......*/
    13.     $this->query_id = mysql_query($query, $this->conn_id);
    14.     return $this->query_id;
    15.     /*......*/
    16.   }
    17.   function fetch_assoc($query_id = "") {
    18.     if ($query_id == ""){
    19.       $query_id = $this->query_id;
    20.     }
    21.     return  mysql_fetch_array($query_id, MYSQL_ASSOC);
    22.   }
    23.   function affected_rows($query_id = ""){
    24.     if ($query_id == ""){
    25.       $query_id = $this->query_id;
    26.     }
    27.     return  mysql_affected_rows($query_id);
    28.   }
    29. }
    30.  
    31. $db = new db;
    32. $db->connect();
    33. ?>
    Функции роботы с сессиями
    PHP:
    1. <?php
    2. function sess_open($save_path, $session_name) {
    3.     return true;
    4. }
    5.  
    6. function sess_close() {
    7.     return true;
    8. }
    9.  
    10. function sess_read($session_id) {
    11.   global $db;
    12.  
    13.   if ($result = $db->query("SELECT data FROM {prefix}sessions WHERE session_id = '".addslashes($session_id)."' AND life_time > ".time()." LIMIT 1")){
    14.     return $db->fetch_assoc($result);
    15.   } else {
    16.     return FALSE;
    17.   }
    18. }
    19.  
    20. function sess_write($session_id, $data) {
    21.   if (!$data || preg_match('~^[A-Za-z0-9]{16,32}$~', $session_id) == 0){
    22.     return FALSE;
    23.   }
    24.  
    25.   global $db, $config;
    26.  
    27.   $lifetime = time() + $config['sess_lifetime'];
    28.  
    29.   $data = mysql_real_escape_string($data);
    30.  
    31.   $result = $db->query("UPDATE {prefix}sessions SET data = '".addslashes($data)."', life_time = ".$lifetime." WHERE session_id = '".addslashes($session_id)."' LIMIT 1");
    32.  
    33.   if ($db->affected_rows() == 0)
    34.     $result = $db->query("INSERT IGNORE INTO {prefix}sessions (session_id, data, life_time) VALUES ('".addslashes($session_id)."', '".addslashes($data)."', ".$lifetime.")");
    35.  
    36.   return $result;
    37. }
    38.  
    39. function sess_destroy($session_id) {
    40.   if (preg_match('~^[A-Za-z0-9]{16,32}$~', $session_id) == 0)
    41.     return false;
    42.  
    43.   global $db;
    44.  
    45.   return $db->query("DELETE FROM {prefix}sessions WHERE session_id = '".addslashes($session_id)."' LIMIT 1");
    46. }
    47.  
    48. function sess_gc($session_lifetime) {
    49.     global $db;
    50.     return $db->affected_rows($db->query("DELETE FROM {prefix}sessions WHERE life_time < ".time()));
    51. }
    52.  
    53. session_set_save_handler("sess_open", "sess_close", "sess_read", "sess_write", "sess_destroy", "sess_gc");
    54. ?>
    Значение $config
    PHP:
    1. <?php
    2. $config['sess_lifetime'] = '1440';
    3. ?>
    А вот и ошибка
    Ошибка отладчика: session.php строка 35 - Call to a member function query() on a non-object
    Подскажите, что не так и как исправить.
     
  2. Ti

    Ti Активный пользователь

    С нами с:
    3 июл 2006
    Сообщения:
    2.378
    Симпатии:
    1
    Адрес:
    d1.ru, Екатеринбург
    $db не обьект.
     
  3. dark-demon

    dark-demon Активный пользователь

    С нами с:
    16 фев 2007
    Сообщения:
    1.920
    Симпатии:
    1
    Адрес:
    леноград
    проблема в том, что $db не проинициализирована до использования.
     
  4. oligarx

    oligarx Активный пользователь

    С нами с:
    23 янв 2007
    Сообщения:
    68
    Симпатии:
    0
    Адрес:
    Украина Львов
    Такие слова! До этого я думал, что хоть что-то понимаю в PHP.
    Спрошу по другому: как сделать так чтобы заработало.
     
  5. DarkElf

    DarkElf Активный пользователь

    С нами с:
    22 окт 2006
    Сообщения:
    1.632
    Симпатии:
    0
    oligarx

    а как файлы то объединяешь? пока есть 3 файла, никак не связанные между собой:)
     
  6. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    0. совсем нет обработок ошибок. совсем. плохо.

    1. зачем $conn_id public? уж его точно надо прятать от всех. protected. впрочем как и query_id, привем она не _id а resource.

    2. mysql_query() в случае неудачи возвращает FALSE, а никак не ""
    if ($query_id == ""){

    читаем внимательно документацию.

    3. хорошим тоном делать $db->close();

    3.1 надо зать не addslashes() а mysql_escape_string()

    4. Я привык работать с объектами, потому всегда возвращаю mysql_fetch_object();
     
  7. oligarx

    oligarx Активный пользователь

    С нами с:
    23 янв 2007
    Сообщения:
    68
    Симпатии:
    0
    Адрес:
    Украина Львов
    Файлы вызываются из Index.php.
    PHP:
    1. <?php
    2. $config['sess_lifetime'] = '1440';
    3. Include_once (‘db.php’);
    4. Include_once(‘sess.php’);
    5. ?>
    Обработка ошибок есть, просто я убрал все что можно, для экономии места.

    Исправлю

    Экономил место

    Кому что удобней

    Так что я сделал не так? Как мне исправить ситуацию?
     
  8. DarkElf

    DarkElf Активный пользователь

    С нами с:
    22 окт 2006
    Сообщения:
    1.632
    Симпатии:
    0
    oligarx

    попробуй require_once()
     
  9. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    я бы в сессию передавал ссылку на $db и работал уже с ней, а не через global

    а если коннект один то через паттерн db:GetInstance() и вперед
     
  10. oligarx

    oligarx Активный пользователь

    С нами с:
    23 янв 2007
    Сообщения:
    68
    Симпатии:
    0
    Адрес:
    Украина Львов
    Прошелся отладчиком и вот что получилось
    PHP:
    1. <?php function sess_read
    роботает нормально делает запрос к базе все ок, а
    PHP:
    1. <?php function sess_write
    вылитает с ошибкой
    Код (Text):
    1. Call to a member function query() on a non-object
    Что вогнало меня в еще больший тупик ведь
    PHP:
    1. <?php global $db;
    обявляется и там и там.
    Мужики обясните дураку где, а лучше где и как изменить этот код чтобы он нормально роботал.
     
  11. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    1. для отладки достаточно обычного print('');
    2. не видя всего кода как сказать-то, тебе дураку, что ты там нахимичил?
     
  12. Ti

    Ti Активный пользователь

    С нами с:
    3 июл 2006
    Сообщения:
    2.378
    Симпатии:
    1
    Адрес:
    d1.ru, Екатеринбург
    все замечательно, только обьект базы данных нужно создать до открытии сессии.

    PHP:
    1. <?
    2. global $db;
    3. $db = new db; // или как там у вас
     
  13. oligarx

    oligarx Активный пользователь

    С нами с:
    23 янв 2007
    Сообщения:
    68
    Симпатии:
    0
    Адрес:
    Украина Львов
    вообщето $db объявляется до старта сессии в файле "Класс БД"

    Прошелся отладчиком и вот что получилось
    PHP:
    1.  
    2. <?php function sess_read
    роботает нормально делает запрос к базе все ок, а после этого запускается
    PHP:
    1. <?php function sess_write
    и вот здесь вылетает ошибка. тоесть обьект базы данных создан нормально. иначе ошибка появилась после sess_read
     
  14. Ti

    Ti Активный пользователь

    С нами с:
    3 июл 2006
    Сообщения:
    2.378
    Симпатии:
    1
    Адрес:
    d1.ru, Екатеринбург
    значит на момент записи сессии объект базы данных уже уничтожен. Попробуйте самостоятельно закрывать сессию session_write_close
     
  15. Ti

    Ti Активный пользователь

    С нами с:
    3 июл 2006
    Сообщения:
    2.378
    Симпатии:
    1
    Адрес:
    d1.ru, Екатеринбург