English 中文(简体)
编辑课程
原标题:Codeigniter session bugging out with ajax calls

My CodeIgniter app uses the session library and saves data to the DB.

我有时会遇到一些问题,有些问题是在有人呼吁后产生的。

在调查后,似乎有2项同时的职能要求撤销,这就需要会议验证。 一个人会失败,另一个会被罚款。

我之所以能够这样做,是因为没有同时开枪。 但是,我仍然不理解为什么它失败了。 它是否必须用一个电话更新用户厨师和第二电话宣布无效? 或者在阅读行文时,它会 die死吗?

我看一看会议的核心类别,没有发现任何原因。

如果有人在我面前也存在同样的问题,我会赞赏就如何辩论或原因提出建议。

Thanks!

EDIT:

我最初说,有408份身份返回。 这是一个无关的情况。

这是在MyVar.refresh()同时发射的功能:

function (event)
{
    var self$ = this.a$;
    var uid  = this.b$.val();
    var tid  = this.c$.val();
    var jqxhr = $.post( /controller1/index ,{ uid :uid, tid :tid, action :true},function(re)
    {
        if(re.message !=  success )
        {
            MyVar.alert( <span class="msg_error sprite"></span>  + re.error);
            MyVar.refresh();
        } 

    }, json );
    MyVar.refresh();
    return stopDefault(event);
};

www.un.org/Depts/DGACM/index_spanish.htm POSSIBLE SOLUTIONS:

创办人:

很显然,它没有很好地与亚x一起发挥作用。 一种解决办法是,如果是麻风病的话,则取消会议更新;唯一的问题是,我们的网站大多是用麻风树建造的。

此外,仅仅将休息时间——时间——缩短到非常频繁的时期,而且麻省正在做罚款。 此外,还进行了浏览器复读,没有时间。 不能确定,如果会议设计书已经根据阿贾克斯呼吁而改变,而浏览器库则从未更新过。

问题回答

引言

<?php
/**
 * ------------------------------------------------------------------------
 * CI Session Class Extension for AJAX calls.
 * ------------------------------------------------------------------------
 *
 * ====- Save as application/libraries/MY_Session.php -====
 */

class MY_Session extends CI_Session {

    // --------------------------------------------------------------------

    /**
     * sess_update()
     *
     * Do not update an existing session on ajax or xajax calls
     *
     * @access    public
     * @return    void
     */
    public function sess_update()
    {
        $CI = get_instance();

        if ( ! $CI->input->is_ajax_request())
        {
            parent::sess_update();
        }
    }

}

// ------------------------------------------------------------------------
/* End of file MY_Session.php */
/* Location: ./application/libraries/MY_Session.php */

问题在于届会班的顶替职能,它产生新的会议——在X秒之后。 每页都有会议——如果会议在发出亚克斯呼吁之前提前结束,那呼吁就会失败。

Create a php file in /application/libraries/ with the name MY_Session (or whatever prefix you set), paste this code there and that is all. This function will override the sess_update function in the session class, checking on every request if that request was made by ajax, skipping the sess_update function.

这是一种坏的观念,将雕塑成更高价值。 这是一种安全特征,将保护你避免坐牢。

民主党:如果你愿意理解我刚才所知道的东西,那不会非常流利。

我们有这个问题,是因为在没收的.php中,时间——直到更新参数。 CI利用这一手段更新会议记录。 如果变化发生在亚克斯呼吁中, CI会派新的厨师告诉新会议记号。 令人不舒服的是,浏览者似乎忽视了这一表象,并保留了旧的会议。

我们定下来,在座各位——时间——到会后——在座。

$config[ sess_time_to_update ] = $config[ sess_expiration ]; 

在使用以下配置时,我也存在这一问题:

$config[ sess_use_database ]    = TRUE;

$config[ sess_time_to_update ]  = 300;

我认为,它与亚克斯要求毫无关系,而是与代号施令的对照。

看来,当你将本届会议储存在数据库中时,在300秒后,就被迫进行伐木。 经过3小时的搜查和分析,发现该法典有明显缺陷,而且不明确。

创建新档案:MY_Session.php申请/图书馆夹

加入以下法典:

<?php
// fixed by sirderno 2013

if ( ! defined( BASEPATH )) exit( No direct script access allowed ); 

class MY_Session extends CI_Session
{

    public function __construct()
    {
        parent::__construct();
    }

    /**
     * Update an existing session
     *
     * @access  public
     * @return  void
     */
    public function sess_update()
    {
        // We only update the session every five minutes by default
        if (($this->userdata[ last_activity ] + $this->sess_time_to_update) >= $this->now)
        {
            return;
        }

        // Save the old session id so we know which record to
        // update in the database if we need it
        $old_sessid = $this->userdata[ session_id ];
        $new_sessid =   ;
        while (strlen($new_sessid) < 32)
        {
            $new_sessid .= mt_rand(0, mt_getrandmax());
        }

        // To make the session ID even more secure we ll combine it with the user s IP
        $new_sessid .= $this->CI->input->ip_address();

        // Turn it into a hash
        $new_sessid = md5(uniqid($new_sessid, TRUE));

        // Update the session data in the session data array
        $this->userdata[ session_id ] = $new_sessid;
        $this->userdata[ last_activity ] = $this->now;

        // _set_cookie() will handle this for us if we aren t using database sessions
        // by pushing all userdata to the cookie.
        $cookie_data = NULL;

        // Update the session ID and last_activity field in the DB if needed
        if ($this->sess_use_database === TRUE)
        {
            // set cookie explicitly to only have our session data
            $cookie_data = array();
            foreach (array( session_id , ip_address , user_agent , last_activity ) as $val)
            {
                $cookie_data[$val] = $this->userdata[$val];
            }

            $cookie_data[ session_id ] = $new_sessid;  // added to solve bug

                    //added to solve bug
            if (!empty($this->userdata[ user_data ]))
                $cookie_data[ user_data ] = $this->userdata[ user_data ];

            $this->CI->db->query($this->CI->db->update_string($this->sess_table_name, array( last_activity  => $this->now,  session_id  => $new_sessid), array( session_id  => $old_sessid)));

        }

        // Write the cookie
        $this->_set_cookie($cookie_data);
    }

    /**
     * Write the session cookie
     *
     * @access  public
     * @return  void
     */
    public function _set_cookie($cookie_data = NULL)
    {
        if (is_null($cookie_data))
        {
            $cookie_data = $this->userdata;
        }

        // Serialize the userdata for the cookie
        $cookie_data = $this->_serialize($cookie_data);

        if ($this->sess_encrypt_cookie == TRUE)
        {
            $cookie_data = $this->CI->encrypt->encode($cookie_data);
        }
        else
        {
            // if encryption is not used, we provide an md5 hash to prevent userside tampering
            $cookie_data = $cookie_data.md5($cookie_data.$this->encryption_key);
        }

        $_COOKIE[ $this->sess_cookie_name ] = $cookie_data;  // added to solve bug

        $expire = ($this->sess_expire_on_close === TRUE) ? 0 : $this->sess_expiration + time();

        // Set the cookie
        setcookie(
                    $this->sess_cookie_name,
                    $cookie_data,
                    $expire,
                    $this->cookie_path,
                    $this->cookie_domain,
                    $this->cookie_secure
                );
    }   
}


?>

清晰的对照是,它确实储存了用户——在更新的厨师中的数据。 含糊不清之处在于,它执行的是档案会议所具备的职能。 在更新新届会之后,即不知道为什么会发生这种情况,因为我期望在更新之前执行,而不是在届会建筑商撰写之后执行。 因此,主人的作用是从老会议开始阅读旧的厨师信息,希望将其与数据库中的会议相提并论,但在会议之后,在数据库中又没有更新这一信息,因此造成停尸。

这一条行文在功能上贯穿会议。 php档案负责阅读旧的厨师信息:

$session = $this->CI->input->cookie($this->sess_cookie_name);

因此,在职能中——cookie of MY_Session.php i 添加这一编码线,以更新服务器旧的 co基信息,新信息是:

$_COOKIE[ $this->sess_cookie_name ] = $cookie_data;  // added to solve bug

随着时间的推移,数据基应当进行罚款。 这是一个简单易变的固定点。

我在把图像上加亚X时也存在同样的问题,在座标上设定了<代码>sess_expiration<>/code>:

$config[ sess_expiration ] = time()+10000000;

它确定了我的问题。

好的解决方案也在这里。 做任何事——时间——时间——时间等——尝试以下解决办法:

  1. https://degreesofzero.com/article/fixing-the-expiring-session-problem-in-codeigniter.html
  2. http://ellislab.com/forums/viewthread/138823/#725078

“1”一号解决方案 在与伊委会进行了大量辩论之后,才得出了两个理由,即损失审委会届会。 其中一个时候是,会议突然中断,会议中断;其次是在被误认为会影响 CI会期图书馆的传票功能之后。 缩略语 买卖儿童、儿童卖淫和儿童色情制品

/*add this code to MY_Session.php*/     
function sess_destroy()
{
// Do NOT update an existing session on AJAX calls.
if (!$this->CI->input->is_ajax_request())
{
return parent::sess_destroy();
}
/* WHEN USER HIS/HER SELF DO A LOGOUT AND ALSO IF PROGRAMMER SET TO LOGOUT USING AJAX CALLS*/
$firsturlseg = $this->CI->security->xss_clean( $this->CI->uri->segment(1) );        
$securlseg = $this->CI->security->xss_clean( $this->CI->uri->segment(2) );      
if((string)$firsturlseg==(string) put ur controller name which u are using for login  &&    (string)$securlseg==(string) put url controler function for logout )
{
 return parent::sess_destroy();
}
}

希望之th也帮助了u人

似乎还有许多旧的 CI版本在使用中,我希望增加两个百分点,尽管这一版已经过时。 我刚刚花了几天时间解决了《国际宇宙航空研究宪章》在《国际公认法典》中发出的呼吁问题,我有一个解决办法,涉及主要问题,尽管某些解决办法是 wonder的。 我(现在)使用的 CI版是2.1.3

我的申请要求美国宇宙航空研究开发机构更新最后的活力领域,以维持一个有效的会议,因此,我仅仅放弃更新关于美国宇宙航空研究开发机构呼吁的会议是不够的。

ess版(我尚未对最近版本进行调查)的错误检验和基本内容(我尚未调查)以及许多问题开始到那里。

第一部分:<代码>sess_update()

几内亚民主军多次呼吁创造种族条件,使数据库被锁定,供日后打电话。 如果我们试图进行更新问询,但数据库被锁定,我们就会发现错误,问答错误,但厨师仍在更新新数据。 BAD! 而且,我们不需要举行新的会议——每次阿贾克斯呼吁都这样做。 我们只需要更新最后活动。 为此:

    function sess_update()
{
    // We only update the session every five minutes by default
    if (($this->userdata[ last_activity ] + $this->sess_time_to_update) >= $this->now)
    {
        return;
    }

    // Save the old session id so we know which record to
    // update in the database if we need it

    $old_sessid = $this->userdata[ session_id ];
    //Assume this is an AJAX call... keep the same session_id
    $new_sessid = $old_sessid;

    if( !$this->CI->input->is_ajax_request() ){ 
        //Then create a new session id
        while (strlen($new_sessid) < 32)
        {
            $new_sessid .= mt_rand(0, mt_getrandmax());
        }

        // To make the session ID even more secure we ll combine it with the user s IP
        $new_sessid .= $this->CI->input->ip_address();

        // Turn it into a hash
        $new_sessid = md5(uniqid($new_sessid, TRUE));

    }

    // _set_cookie() will handle this for us if we aren t using database sessions
    // by pushing all userdata to the cookie.
    $cookie_data = NULL;

    // Update the session ID and last_activity field in the DB if needed
    if ($this->sess_use_database === TRUE)
    {

        //TRY THE QUERY FIRST!
        //Multiple simultaneous AJAX calls will not be able to update because the Database will be locked. ( Race Conditions )
        //Besides... We don t want to update the cookie if the database didn t update
        $query = $this->CI->db->query($this->CI->db->update_string($this->sess_table_name, array( last_activity  => $this->now,  session_id  => $new_sessid), array( session_id  => $old_sessid)));
        if( $query ){

            // Update the session data in the session data array
            $this->userdata[ session_id ] = $new_sessid;
            $this->userdata[ last_activity ] = $this->now;

            // set cookie explicitly to only have our session data
            $cookie_data = array();
            foreach (array( session_id , ip_address , user_agent , last_activity ) as $val)
            {
                $cookie_data[$val] = $this->userdata[$val];
            }

            // Write the cookie
            $this->_set_cookie($cookie_data);

        }else{
            //do nothing... we don t care, we still have an active retreivable session and the update didn t work
            //debug: error_log( "ERROR::" . $this->CI->db->_error_message() ); //Shows locked session database
        }
    }else{
        // Update the session data in the session data array
        $this->userdata[ session_id ] = $new_sessid;
        $this->userdata[ last_activity ] = $this->now;

        // Write the cookie
        $this->_set_cookie($cookie_data);
    }
}

第二部分:<代码>sess_read()

这里的类似问题...... 数据库有时在盘问时被锁定。 除此以外,我们不能忽视错误。 我们试图阅读本届会议,看看它是否存在......这样,如果我们遇到一个锁定的数据库错误,我们就可以检查错误和(再次)(如果需要的话,会同时进行)。 在我的测试中,我从未使它陷入两条).。 而且,我不了解你的情况,但我不想让瑞典公司通过不核对虚假的询问结果而陷入致命的错误。 你们需要在本届会议的顶点这样做。 如果你想直接尝试这一法典,则将提交:

var $sess_query_attempts = 5;

请注意,整个<条码>已到<>。 职能

$query = $this->CI->db->get($this->sess_table_name);

//Multiple AJAX calls checking
//But adding add a loop to check a couple more times has stopped premature session breaking
$counter = 0;
while( !$query && $counter < $this->sess_query_attempts     ){

    usleep(100000);//wait a tenth of a second

   $this->CI->db->where( session_id , $session[ session_id ]);

    if ($this->sess_match_ip == TRUE)
   {
        $this->CI->db->where( ip_address , $session[ ip_address ]);
    }

    if ($this->sess_match_useragent == TRUE)
    {
        $this->CI->db->where( user_agent , $session[ user_agent ]);
    }

    $query = $this->CI->db->get($this->sess_table_name);

    $counter++;
}
if ( !$query || $query->num_rows() == 0)
{
    $this->CI->db->where( session_id , $session[ session_id ]);
    $query = $this->CI->db->get( $this->sess_table_name );

    $this->sess_destroy();
    return FALSE;
}

不管怎么说,那里对这个问题没有完全的答案,我感到,我与那些在像我国这样使用吨的亚马斯特加的矿址上可能仍然经历过早期会议时间点的人分享我的调查结果。





相关问题
why the session in iis automatically log out?

I used iis6, and when i called a function Directory.delete(), the all the session relate this website will be logged out. and i debugged the website, i found no exception. any one have ideas on this ? ...

Check session from a view in CodeIgniter

What is the best way to check session from a view in CodeIgniter, it shows no way in their user guide, otherwise I will have to make two views on everything, which is kinda weird...still a newbie to ...

Can I get the size of a Session object in bytes in c#?

Is it possible to get the size(in bytes) of a Session object after storing something such as a datatable inside it? I want to get the size of a particular Session object, such as Session["table1"], ...

提供严格分类的出席会议物体

提供严格分类的与会机会的最佳方式是什么? 我正计划转而选择矩阵,这正在促使汇编者抱怨我的幻觉方案拟订方法......

PHP Session is not destroying after user logout

I m trying to create an authentication mechanism for my PHP Application and I m having difficulty destroying the session. I ve tried unsetting the authentication token which was previously set within ...

热门标签