PHP सत्र नहीं ले जा रहा है

मुझे पता है कि यह कई बार पूछा गया है, मैंने SO को खराब कर दिया है, प्रदान किए गए हर संयोजन की कोशिश की है और हर विधि जिसे मैं सोच सकता हूं, और मैं अभी भी नुकसान में हूं ..

Here's the scenario: I've just wrote up and fully tested a login system. The code processes as it should, but the $_SESSION isn't carrying over. Assuming I've entered the correct details: I've checked multiple different things. print_r($_SESSION) returns "Array( [user] => 1 )" on the index (where the login is) upon form submission, but returns "Array( )" on the next page (dashboard.php)

यहाँ मेरा index.php है

<?php
include(__DIR__ . '/includes/class_mtg_sessions.php');
$session = new Session();
$session->start_session('_mtg', true);
if(isset($_SESSION['user'])) {
    header("Location: dashboard.php");
    exit;
}
include(__DIR__ . '/includes/header.php');
?><div id="templatemo_main">
    <div class="content_wrapper">
        <div class="col_1">
            

Client Area

Image 4

<div id="contact_form" class="col_2 left">

Login

<?php if(isset($_POST['submit'])) { $str = array('name', 'password'); foreach($str as $what) { $_POST[$what] = isset($_POST[$what]) && is_string($_POST[$what]) ? strtolower($db->escape(trim($_POST[$what]))) : null; if(empty($_POST[$what])) $mtg->error("You didn't enter a valid ".$what); } $selectUser = $db->query("SELECT `id` FROM `users` WHERE ((LOWER(`username`) = '".$_POST['name']."') OR (LOWER(`email`) = '".$_POST['name']."'))"); if(!$db->num_rows($selectUser)) $mtg->error("There doesn't appear to be anyone on record with that ".(filter_var($_POST['name'], FILTER_VALIDATE_EMAIL) ? 'email' : 'username')); $select = $db->query("SELECT `id`, `username` FROM `users` WHERE LOWER(`username`) = '".$_POST['name']."' OR LOWER(`email`) = '".$_POST['name']."' AND `password` = '".$mtg->fuzzehCrypt($_POST['password'])."'"); if(!$db->num_rows($select)) $mtg->error("Invalid ".(filter_var($_POST['name'], FILTER_VALIDATE_EMAIL) ? 'email' : 'username')."/password combination"); $row = $db->fetch_row($select); $_SESSION['user'] = $row['id']; $mtg->success("Welcome back ".$mtg->format($row['username'])."!
Redirecting you now...<meta http-equiv='refresh' content='3; url=dashboard.php' />"); echo "</div></div></div></div>"; include(__DIR__ . '/includes/footer.php'); exit; } ?><form method="post" name="contact" action="index.php"> <div class="col_3"> <input name="name" type="text" class="required input_field" id="name" placeholder="Username/Email" required /> </div> <div class="col_3 no_margin_right"> <input name="password" type="password" class="required input_field" id="password" maxlength="30" placeholder="Password" required /> </div> <div class="clear"></div> <input type="submit" name="submit" value="Submit" class="submit_btn left" /> <input type="reset" name="reset" value="Reset" class="submit_btn right" /> </form> </div>

</div> </div> <div class="content_wrapper"> <div class="col_1">

New member?

<div id="contact_form" class="col_2 left"> Don't have an account? Sign up now!
It's completely free and it allows you to track everything about your order(s), place new orders, directly manage how your current order is being processed and much more! </div>

</div> </div> </div><?php include(__DIR__ . '/includes/footer.php');

Here's the dashboard.php

<?php
include(__DIR__ . '/includes/class_mtg_sessions.php');
$session = new Session();
$session->start_session('_mtg', true);
if(!isset($_SESSION['user'])) {
    header("Location: index.php");
    exit;
}
include(__DIR__ . '/includes/header.php');
$mtg->userdata($_SESSION['user']);

?>    <div id="templatemo_main">
        <div class="content_wrapper">
            <div class="col_1">
                

Client Area

Image 4

<div id="contact_form" class="col_2 left">

Dashboard

Dashboard coming soon </div>

</div> </div> </div><?php include(__DIR__ . '/includes/footer.php');

And finally, the session class I'm using.

<?php
ini_set('display_errors', true);
error_reporting(E_ALL);
class Session {
    function __construct() {
        session_set_save_handler(
            array(&$this, 'open'),
            array(&$this, 'close'),
            array(&$this, 'read'),
            array(&$this, 'write'),
            array(&$this, 'destroy'),
            array(&$this, 'gc')
        );
        register_shutdown_function('session_write_close');
    }

    function start_session($session_name, $secure) {
        if(in_array('sha512', hash_algos()))
            ini_set('session.hash_function', 'sha512');
        ini_set('session.hash_bits_per_character', 5);
        ini_set('session.use_only_cookies', 1);

        $cookieParams = session_get_cookie_params();
        session_set_cookie_params($cookieParams['lifetime'], $cookieParams['path'], $cookieParams['domain'], $secure, true);
        session_name($session_name);
        session_start();
        session_regenerate_id(true);
    }

    function open() {
        include(__DIR__ . '/definitions.php');
        $this->db = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_BASE) or exit("Couldn't connect to the database");
        return true;
    }

    function close() {
        $this->db->close();
        return true;
    }

    function read($id) {
        if(!isset($this->read_stmt))
            $this->read_stmt = $this->db->prepare("SELECT `data` FROM `sessions` WHERE `id` = ? LIMIT 1");
        $this->read_stmt->bind_param('s', $id);
        $this->read_stmt->execute();
        $this->read_stmt->store_result();
        $this->read_stmt->bind_result($data);
        $this->read_stmt->fetch();
        $key  = $this->getkey($id);
        $data = $this->decrypt($data, $key);
        return $data;
    }

    function write($id, $data) {
        $key  = $this->getkey($id);
        $data = $this->encrypt($data, $key);
        $time = time();
        if(!isset($this->w_stmt))
            $this->w_stmt = $this->db->prepare("REPLACE INTO `sessions` (`id`, `set_time`, `data`, `session_key`) VALUES (?, ?, ?, ?)") or trigger_error(mysqli_error($this->db));
        $this->w_stmt->bind_param('siss', $id, $time, $data, $key);
        $this->w_stmt->execute();
        return true;
    }

    function destroy($id) {
        if(!isset($this->delete_stmt))
            $this->delete_stmt = $this->db->prepare("DELETE FROM `sessions` WHERE `id` = ?") or trigger_error(mysqli_error($this->db));
        $this->delete_stmt->bind_param('s', $id);
        $this->delete_stmt->execute();
        return true;
    }

    function gc($max) {
        if(!isset($this->gc_stmt))
            $this->gc_stmt = $this->db->prepare("DELETE FROM `sessions` WHERE `set_time` < ?") or trigger_error(mysqli_error($this->db));
        @$this->gc_stmt->bind_param('s', (time() - $max));
        $this->gc_stmt->execute();
        return true;
    }

    private function getkey($id) {
        if(!isset($this->key_stmt))
            $this->key_stmt = $this->db->prepare("SELECT `session_key` FROM `sessions` WHERE `id` = ? LIMIT 1") or trigger_error(mysqli_error($this->db));
        $this->key_stmt->bind_param('s', $id);
        $this->key_stmt->execute();
        $this->key_stmt->store_result();
        if($this->key_stmt->num_rows == 1) {
            $this->key_stmt->bind_result($key);
            $this->key_stmt->fetch();
            return $key;
        } else {
            $random_key = hash('sha512', uniqid(mt_rand(1, mt_getrandmax()), true));
            return $random_key;
        }
    }

    private function encrypt($data, $key) {
        $salt      = 'agar16565!sfrb0a0$£%^&njswdUEB(*£8034672839ngrwu*(£89bgaq90hmw4n';
        $key       = substr(hash('sha256', $salt . $key . $salt), 0, 32);
        if(!function_exists('mcrypt_get_iv_size'))
            exit("mCrypt not enabled");
        $iv_size   = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB);
        $iv        = mcrypt_create_iv($iv_size, MCRYPT_RAND);
        $encrypted = base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key, $data, MCRYPT_MODE_ECB, $iv));
        return $encrypted;
    }

    private function decrypt($data, $key) {
        $salt      = 'agar16565!sfrb0a0$£%^&njswdUEB(*£8034672839ngrwu*(£89bgaq90hmw4n';
        $key       = substr(hash('sha256', $salt . $key . $salt), 0, 32);
        if(!function_exists('mcrypt_get_iv_size'))
            exit("mCrypt not enabled");
        $iv_size   = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB);
        $iv        = mcrypt_create_iv($iv_size, MCRYPT_RAND);
        $decrypted = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $key, base64_decode($data), MCRYPT_MODE_ECB, $iv);
        return $decrypted;
    }
}

Database structure for the users and sessions tables (using SHOW CREATE TABLE):

CREATE TABLE `sessions` (
  `id` char(128) NOT NULL,
  `set_time` char(10) NOT NULL,
  `data` text NOT NULL,
  `session_key` char(128) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `id` (`id`),
  KEY `session_key` (`session_key`),
  KEY `set_time` (`set_time`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
--
CREATE TABLE IF NOT EXISTS `users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(255) NOT NULL DEFAULT '',
  `email` varchar(255) NOT NULL DEFAULT '',
  `verified` enum('Yes','No','Flagged') NOT NULL DEFAULT 'No',
  `ver_code` varchar(255) NOT NULL DEFAULT '',
  `password` varchar(255) NOT NULL DEFAULT '',
  `ip` varchar(255) NOT NULL DEFAULT '',
  `country` varchar(255) NOT NULL DEFAULT '',
  `type` enum('standard','admin') NOT NULL DEFAULT 'standard',
  PRIMARY KEY (`id`),
  UNIQUE KEY `username` (`username`),
  UNIQUE KEY `email` (`email`),
  KEY `type` (`type`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=2 ;

Now, I'm using the same class on a different site hosted on the same server and it works absolutely fine. I've checked the permissions for the tmp directory, and those are fine (I have WHM/SSH access) All classes that are supposed to connect to the database have connected perfectly fine with no issues

Someone please put me out of my misery and save what's left of my sanity!

[edit][1] I've tried w00d's method (of setting the session_regenerate_id(true) to false), still no luck) I've also tried completely removing the session_regenerate_id(true); and the same issue remains

[edit][2] Removing the call to the session class and using the standard session_start() appears to "fix" it but, in doing so, I've unwillingly disabled the database system.

As I've said, the class works perfectly on another s

0

2 उत्तर

शायद यहां समस्या:

    session_regenerate_id(true);

Why? taken here

बूल session_regenerate_id ([bool $ delete_old_session = false])   session_regenerate_id() वर्तमान सत्र आईडी को एक नए से बदल देगा   एक, और वर्तमान सत्र जानकारी रखें।

प्रत्येक बार start_session निष्पादित किया जाता है, यह जानकारी को प्रतिस्थापित करेगा। आप true को हटाने का प्रयास कर सकते हैं और देख सकते हैं कि यह अपेक्षा के अनुसार काम करता है या नहीं।

0
जोड़ा
गलत मुद्दे पर सेट करना एक ही मुद्दा है। फिर भी आपका धन्यवाद
जोड़ा लेखक Magictallguy, स्रोत
अधिकतर डेटाबेस को अद्यतित रखने और एकाधिक प्रविष्टियों के स्पष्ट होने के लिए।
जोड़ा लेखक Magictallguy, स्रोत
बस स्पष्ट करने के लिए: आप अनुरोध कर रहे हैं कि मैं कक्षा में किसी भी कॉल को हटा दूं और इसके बजाय PHP के देशी session_start का उपयोग करें? यदि ऐसा है, तो किया, और पूरी तरह से काम कर रहा है। जिसका मतलब है ... हम्म ... मूल पोस्ट अपडेट किया गया
जोड़ा लेखक Magictallguy, स्रोत
समझा। खैर, आपकी मदद के लिए धन्यवाद। अमूल्य! मैंने आपका जवाब सही के रूप में चिह्नित किया है। उम्मीद है कि, मुझे आपको फिर से परेशान नहीं करना पड़ेगा। धन्यवाद :)
जोड़ा लेखक Magictallguy, स्रोत
आप आईडी को पुन: उत्पन्न क्यों करना चाहते हैं? इसे PHP सत्र खो जाता है आईडी पुन: उत्पन्न करें "> stackoverflow.com/questions/19656129/…
जोड़ा लेखक w00d, स्रोत
क्या आप एक सरल मामला बना सकते हैं: सभी सत्र सेटिंग्स को हटाएं, केवल session_start() और अपना सत्र जांचें? session_save_path() प्रिंट करें और उस निर्देशिका को जांचें। यदि यह सही है तो आपको session_id के साथ कुछ फ़ाइल को नाम के रूप में देखना चाहिए, देखें कि कोई डेटा संग्रहीत है या नहीं
जोड़ा लेखक w00d, स्रोत
हां, या आप कक्षा का उपयोग करना जारी रख सकते हैं लेकिन start_session पर, session_start() का उपयोग करें
जोड़ा लेखक w00d, स्रोत
यदि यह काम करता है, तो आप प्रत्येक सुविधा में धीरे-धीरे जोड़ सकते हैं यह देखने के लिए कि कौन सी समस्या का कारण बनता है, मेरा दूसरा अनुमान यह है कि session_set_cookie_params समस्या का कारण बन सकता है, पहली बार जब आप session_get_cookie_params करते हैं सत्र में शुरुआत करने के लिए कुछ भी नहीं है।
जोड़ा लेखक w00d, स्रोत

कारण "सत्र उपयोग में हो सकता है"

कड़ी मेहनत के बाद हार्ड कोड कोड session_write_close (); रखें

यह ध्यान दिया जाना चाहिए कि register_shutdown_function() session_write_close() की गारंटी नहीं देता है; जैसा आपने किया है

0
जोड़ा