За последние 24 часа нас посетили 17270 программистов и 1216 роботов. Сейчас ищет 1521 программист ...

Проблема с записью сессий в DB

Тема в разделе "PHP для новичков", создана пользователем LoyZ, 18 фев 2010.

  1. LoyZ

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

    С нами с:
    4 янв 2010
    Сообщения:
    8
    Симпатии:
    0
    Адрес:
    Хабаровск
    Здравствуйте, господа.
    Столкнулся с проблемой, уже 2 дня сижу, туплю, ничего не могу понять. Не записываются в базу, хоть головой бейся =)
    Однозначно накосячил, но не могу понять где. Может свежим взглядом, поможете?
    [sql]CREATE TABLE IF NOT EXISTS `sessions` (
    `id` varchar(32) NOT NULL,
    `timestamp` int(10) unsigned DEFAULT NULL,
    `sess_data` text,
    PRIMARY KEY (`id`)
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8;[/sql]

    и функции
    PHP:
    1.  
    2. <?php
    3.     function custom_open()  {
    4.  
    5.         global $link;
    6.  
    7.         if ($link = mysqli_connect (_DB_HOST_,
    8.                                 _DB_USER_,
    9.                                 _DB_PASS_,
    10.                                 _DB_NAME_)) {
    11.  
    12.             return $link;
    13.  
    14.         }
    15.  
    16.         else return (false);
    17.     }
    18.  
    19. ################################################################################
    20.  
    21.     function custom_close() {
    22.  
    23.         global $link;
    24.  
    25.         return mysqli_close($link);
    26.  
    27.     }
    28.  
    29.  
    30.  
    31. ################################################################################
    32.  
    33.     function custom_read($id)   {
    34.  
    35.         global $link;
    36.        
    37.         $id = mysqli_real_escape_string($link, $id);
    38.  
    39.         $sql = "SELECT sess_data
    40.                 FROM sessions
    41.                 WHERE id = '$id'";
    42.  
    43.         if ($result = mysqli_query($link, $sql)) {
    44.  
    45.             $row = mysqli_fetch_assoc($result);
    46.  
    47.             return (string) $row['sess_data'];
    48.  
    49.             mysqli_free_result($result);
    50.  
    51.         }
    52.  
    53.     }
    54.  
    55. ################################################################################
    56.  
    57.     function custom_write($id, $sess_data)  {
    58.  
    59.         global $link;
    60.        
    61.  
    62.         $timestamp = time ();
    63.  
    64.         $id = mysqli_real_escape_string($link, $id);
    65.  
    66.         $sess_data = mysqli_real_escape_string($link, $sess_data);
    67.  
    68.         $sql = "REPLACE INTO sessions
    69.                 VALUES ('$id', '$timestamp', '$sess_data')";
    70.  
    71.         if ($result = mysqli_query($link, $sql))    {
    72.  
    73.             return $result;
    74.  
    75.             mysqli_free_result($result);
    76.  
    77.         }
    78.  
    79.         else return (false);
    80.  
    81.     }
    82.  
    83. ################################################################################
    84.  
    85.     function custom_destroy($id)    {
    86.  
    87.         global $link;
    88.        
    89.  
    90.         $id = mysqli_real_escape_string($link, $id);
    91.  
    92.         $sql = "DELETE FROM sessions
    93.                 WHERE id = '$id'";
    94.  
    95.         if ($result = mysqli_query($link, $sql))    {
    96.  
    97.             return $result;
    98.  
    99.             mysqli_free_result($result);
    100.  
    101.         }
    102.  
    103.         else return (false);
    104.  
    105.     }
    106.  
    107. ################################################################################
    108.  
    109.     function custom_gc($maxlifetime)    {
    110.  
    111.         global $link;
    112.        
    113.  
    114.         $sql = "DELETE FROM sessions
    115.                 WHERE timestamp < '".time() - $maxlifetime."'";
    116.  
    117.         if ($result = mysqli_query($link, $sql))    {
    118.  
    119.             return $result;
    120.  
    121.             mysqli_free_result($result);
    122.  
    123.         }
    124.  
    125.         else return (false);
    126.  
    127.     }
    128.  
    129.  
    130. ################################################################################
    131.  
    132. session_set_save_handler (  'custom_open',
    133.                             'custom_close',
    134.                             'custom_read',
    135.                             'custom_write',
    136.                             'custom_destroy',
    137.                             'custom_gc');
    138.  
    139. ?>

    Вот почему-то custom_read() работает, а вот custom_write() уже нет... Может тут какая то хитрость ext mysqli? Сначала набросал в ОО интерфейсе - не работает, потом вот таким видом сделал - не работает, часа 4 назад, уже из принципа накидал черновичек с использованием ext mysql ... всё работает и читает и пишет (дальше не рассматривал).


    Ну вот что может быть? =))
     
  2. Simpliest

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

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    недурно бы сообщения об ошибках увидеть.
     
  3. LoyZ

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

    С нами с:
    4 янв 2010
    Сообщения:
    8
    Симпатии:
    0
    Адрес:
    Хабаровск
    Прошу прощения
    Код (Text):
    1. Warning: mysqli_real_escape_string() expects parameter 1 to be mysqli, null given in X:\home\www\loyz.hm\httpdocs\scr\session.php on line 301
    2.  
    3. Warning: mysqli_real_escape_string() expects parameter 1 to be mysqli, null given in X:\home\www\loyz.hm\httpdocs\scr\session.php on line 303
    4.  
    5. Warning: mysqli_query() expects parameter 1 to be mysqli, null given in X:\home\www\loyz.hm\httpdocs\scr\session.php on line 308
    6.  
    7. Warning: mysqli_close() expects parameter 1 to be mysqli, null given in X:\home\www\loyz.hm\httpdocs\scr\session.php on line 259
    У меня другая нумерация, но эти ошибки как раз из custom_write() Вот почему-то нет соединения... хотя я так полагаю, что должно быть =) Эхх =))

    Уже пытался изменять запрос [sql]REPLACE INTO sessions
    VALUES ('$id', '$timestamp', '$sess_data')[/sql]
    на 2, то - бишь, либо INSERT, либо UPDATE. Безполезно
     
  4. Volt(220)

    Volt(220) Активный пользователь

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1
    custom_read() и custom_write() работают на одной странице?
    Очень похоже что забыли стартовать сессию или подключить объявление констант.
     
  5. LoyZ

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

    С нами с:
    4 янв 2010
    Сообщения:
    8
    Симпатии:
    0
    Адрес:
    Хабаровск
    константы объявлены в самом начале страницы, потом include() вот этот файлик, а потом стартую сессии... вернее после include() сразу session_name ('sid');

    session_start ();
     
  6. Simpliest

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

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    Как этот код вызывается?
    Где обработка ошибки подключения?
     
  7. LoyZ

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

    С нами с:
    4 янв 2010
    Сообщения:
    8
    Симпатии:
    0
    Адрес:
    Хабаровск
    причём вот в таком виде заботает
    PHP:
    1.  
    2.     function custom_open()  {
    3.  
    4.         global $link;
    5.  
    6.         $link = mysql_connect(  _DB_HOST_,
    7.                                 _DB_USER_,
    8.                                 _DB_PASS_);
    9.  
    10.         return mysql_select_db(_DB_NAME_, $link);
    11.  
    12.     }
    13.  
    14. ////////////////////////////
    15.  
    16.     function custom_close() {
    17.  
    18.         global $link;
    19.  
    20.         return mysql_close($link);
    21.  
    22.     }
    23.  
    24. ////////////////////////
    25.  
    26.     function custom_read($id)   {
    27.  
    28.         global $link;
    29.         global $px;
    30.         global $sesstable;
    31.  
    32.         $id = mysql_real_escape_string($id);
    33.  
    34.         $sql = "SELECT sess_data
    35.                 FROM ".$px.$sesstable."
    36.                 WHERE id = '$id'";
    37.  
    38.         if ($result = mysql_query($sql, $link)) {
    39.  
    40.                 $row = mysql_fetch_assoc($result);
    41.  
    42.                 return $row['sess_data'];
    43.  
    44.         }
    45.  
    46.     }
    47.  
    48. ///////////////////////
    49.  
    50.     function custom_write($id, $sess_data)  {
    51.  
    52.         global $link;
    53.         global $px;
    54.         global $sesstable;
    55.  
    56.         $id = mysql_real_escape_string($id);
    57.  
    58.         $timestamp = mysql_real_escape_string($timestamp);
    59.  
    60.         $sess_data = mysql_real_escape_string($sess_data);
    61.  
    62.         $sql = "REPLACE INTO ".$px.$sesstable."
    63.                 VALUES ('$id','".time()."','$sess_data')";
    64.  
    65.         return mysql_query($sql, $link);
    66.  
    67.     }
    68.  
    69.  
     
  8. Simpliest

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

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
  9. LoyZ

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

    С нами с:
    4 янв 2010
    Сообщения:
    8
    Симпатии:
    0
    Адрес:
    Хабаровск
    Вызывается с помощью include()

    Код (Text):
    1.  
    2. <?
    3. //самое начало страницы
    4.  
    5.  
    6. //подключение конффигурации
    7.  
    8. include ($_SERVER['DOCUMENT_ROOT'].'/config/config.inc.php');
    9.  
    10. //подключение представленного файла
    11.  
    12. include ($_SERVER["DOCUMENT_ROOT"].'/scr/session.php');
    13.  
    14. session_name ('sid');
    15.  
    16. session_start ();
     
  10. LoyZ

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

    С нами с:
    4 янв 2010
    Сообщения:
    8
    Симпатии:
    0
    Адрес:
    Хабаровск
    Simpliest
    Спасибо, видимо этим сейчас и придется заняться =)
     
  11. Luge

    Luge Старожил

    С нами с:
    2 фев 2007
    Сообщения:
    4.680
    Симпатии:
    1
    Адрес:
    Минск
    говорят, mysql_connect возвращает указатель на соединение с БД, а mysqli_connect — объект,
    И ещё говорят, что global для ресурса и объекта это разные вещи.
    Хотя, говорят много чего
     
  12. LoyZ

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

    С нами с:
    4 янв 2010
    Сообщения:
    8
    Симпатии:
    0
    Адрес:
    Хабаровск
    Точно... Object of class mysqli could not be converted to int

    эта ошибка вылетает на session_start()

    всё понял, но как же мне сейчас в функцию ввести объект... но это риторика,

    Всем большое спасибо
     
  13. LoyZ

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

    С нами с:
    4 янв 2010
    Сообщения:
    8
    Симпатии:
    0
    Адрес:
    Хабаровск
    Привет, Ребята!
    Не думал, что апнуть тему придется =)
    3 года, как даже не открывал редактор, и вот на днях поставил nginx, php-fpm mariadb и начались головняки.
    Лежал начатый макет страницы, уже с работающими фишками (точно помню, что они работали), среди которых сохранение сессий в DB.
    Запустил, блин и на те, по какой то непонятной причине php7 не хочет обработать класс записи в базу.
    PHP:
    1.      public static function _start_($name,$random_string) {
    2.  
    3.          self::$random_string = $random_string;
    4.  
    5.          self::$maxLifeTime = intval(get_cfg_var('session.gc_maxlifetime'));
    6.  
    7.          self::$user_agent = md5($_SERVER['HTTP_USER_AGENT'].self::$random_string);
    8.  
    9.              array('session','_open_'),
    10.              array('session','_close_'),
    11.              array('session','_read_'),
    12.              array('session','_write_'),
    13.              array('session','_destroy_'),
    14.              array('session','_gc_')
    15.          );
    16.  
    17.          session_name($name);
    18.  
    19.          session_start();
    20.  
    21.      }
    не хочет срабатывать session_set_save_handler().
    Выдает мне
    Код (Text):
    1. Fatal error: session_start(): Failed to initialize storage module: user (path: /srv/www/tamburin/sess) in /srv/www/tambur.in/htdocs/classes/class.session.inc on line 38
    Может подскажете, хоть в какую сторону смотреть. Голова уже не варит =)))