Witam,

Trafiłem na taki problem: mam napisaną własną procedurę obsługi sesji, która zapisuje zmienne w bazie danych MySQL. Procedura działa bardzo dobrze w normalnym php, natomiast w momencie, w którym do gry wchodzi AJAX, nie jest przekazywany identyfikator, ani żadne zmienne. Nawet próby przekazania identyfikatora w zmiennej kończą się tym, że owszem, procedura odczytuje wszystkie dane z bazy, sesja dostaje właściwy identyfikator, ale tablica zmiennych $_SESSION jest pusta (i potem pusta zostaje zapisana do bazy, kasując całą sesję).

W momencie, w którym korzystam ze standardowego mechanizmu obsługi sesji, wszystko hula.

Czy ktoś jeszcze się natknął na podobny problem? Używam php 5.2.3.

Obsługa sesji (session.inc):

  1. class Session {
  2. .
  3. .
  4. .
  5. function read($id) {
  6. $id = $this->dbHandle->getSQLValues($id);
  7. $data = $this->dbHandle->loadObject("SELECT data FROM wmh_sessions WHERE id = $id", false);
  8. if (is_array($data)) return $data[0];
  9. return '';
  10. }
  11.  
  12. function verify() {
  13. if ((!isset($_SESSION['token']))||($_SESSION['token']!=md5($_SERVER['HTTP_USER_AGENT'].HASH_SECURE))) {
  14. }
  15. }
  16. .
  17. .
  18. .
  19. }
  20.  
  21. $Session_class = new Session();
  22. session_set_save_handler(array(&$Session_class, 'open'),
  23. array(&$Session_class, 'close'),
  24. array(&$Session_class, 'read'),
  25. array(&$Session_class, 'write'),
  26. array(&$Session_class, 'destroy'),
  27. array(&$Session_class, 'clean'));
  28.  
  29. ini_set('session.use_only_cookies',false);
  30. ini_set("session.use_trans_sid", false);
  31. ini_set('session.auto_start', false);
  32. ini_set('register_long_arrays',true);
  33.  
  34. if (isset($_GET['sid']) || isset($_POST['sid'])) { //prevent hijacking
  35. $s = (isset($_GET['sid'])) ? $_GET['sid'] : $_POST['sid'];
  36. session_id ($s);
  37. $Session_class->verify();
  38. } else


Zabezpieczenie w pliku przed nieautoryzowanym dostępem:

  1. require_once('../../config/config.inc');
  2. require_once($rootDir.'classes/session.inc');
  3.  
  4. if (!isset($_SESSION['uname'])) {
  5. echo '<p>Nieautoryzowany dostęp</p>';
  6. die();
  7. }
  8.  


Wywołanie AJAXa z JQuery:
  1. <script type="text/javascript">
  2. $("#sortable").sortable({ opacity: 0.6, cursor: 'move', update: function() {
  3. var sid = '<?php echo session_id() ?>';
  4. var order = $(this).sortable("serialize") + '&sid=' + sid + '&act=rearrange&n=0';
  5. $.post("host/models/menuManipulation.php", order, function(theResponse){
  6. $("#message").html(theResponse);
  7. });
  8. }
  9. });