当前位置: 首页 > 知识库问答 >
问题:

CodeIgniter未通过AJAX保存会话

凤扬
2023-03-14

我有个问题,希望你能帮助我。我的控制器中有一个创建CodeIgniter会话的方法。为确保创建正确,我在创建会话后执行print\r()函数。然后,在我的Ajax请求中,我放置了一个位置。重新加载以刷新页面。

这就是我的方法:

public function CreateSession() {
   $response = $this->mymodel->registerUser();
   //The response in this case of the method registerUser() is an array such as:
   /*
   Array
    (
       [id_web_user] => 982
       [nombre_web_user] => name
       [apellidos_web_user] => lastname
       [user_mail] => asf21@gmail.com
       [user_password] => 202cb962ac59075b964b07152d234b70
       [id_pais] => 1
       [profile_picture] => n/a
       [id_seccion_registro] => 1
       [id_estatus] => 0
       [id_usuario_alta] => 1
       [id_usuario_mod] => 1
       [fecha_ultimo_ingreso] => 2018-03-25 01:43:17
       [fecha_alta] => 2018-03-25 01:43:17
       [fecha_modificacion] => 2018-03-25 01:43:17
    )
    */

    //Then when I get the response array, I create a new array which contains an specific data for store in a session within userdata like:

    $newdata = array(
        'id_web_user' => $response['id_web_user'],
        'nombre_web_user' => $response['nombre_web_user'],
        'apellidos_web_user' => $response['apellidos_web_user'],
        'user_mail' => $response['user_mail'],
        'profile_picture' => $response['profile_picture']
    );

    //Finally I create the session:
    $this->session->set_userdata($newdata);

    //And then, wheter I do a print_r($this->session->userdata) for verify that the session was created successfully, I get something like:
    /*
    Array
    (
       [__ci_last_regenerate] => 1521938249
       [id_web_user] => 983
       [nombre_web_user] => name
       [apellidos_web_user] => lastname
       [user_mail] => asf21@gmail.com
       [profile_picture] => n/a
    )
    */

   //In this step I do an echo 1; because my Ajax request is waiting for that and make a "location.reload()", so:
   echo 1;
}

这种方法称为槽式Ajax,如;

//base_url was defined previously
$.ajax({
   type : "POST",
   url : base_url + "/mycontroller/CreateSession",
   data : {},
   success : function(response) {
      if ( response == 1 ) {
        location.reload();
     }
   }
});

最后,在Ajax请求中,我做了location.reload,但是当页面刷新时,这将把我重定向到http://localhost/,并且当我想检查包含$this的内容时-

我做错了什么?我试图找到一个解决方案,一些人说,会议。CI的php有一个bug,需要替换CI的Github中存在的新bug。另一些人说这是cookies的问题,因为当会话包含超过4KB的数据时,这个数据会自动地出现错误。这简直是疯了,我希望你能帮我。非常感谢您的支持。


共有2个答案

董桐
2023-03-14

谢谢你的回答。我解决了我的问题,但有一些局限性。CodeIgniter似乎不能在会话中的数组中存储大量数据,所以我以创建官方留档中存在的会话为例。

我举的例子来自:https://www.codeigniter.com/user_guide/libraries/sessions.html#adding-session-data

    $newdata = array(
            'username'  => 'johndoe',
            'email'     => 'johndoe@some-site.com',
            'logged_in' => TRUE
    );

    $this->session->set_userdata($newdata);

因此,我基于上面的代码示例构建了一个新的自定义会话。然后,我修改了之前代码的一部分:

$newdata = array(
    'id_web_user' => $response['id_web_user'],
    'nombre_web_user' => $response['nombre_web_user'],
    'apellidos_web_user' => $response['apellidos_web_user'],
    'user_mail' => $response['user_mail'],
    'profile_picture' => $response['profile_picture']
);

//Finally I create the session:
$this->session->set_userdata($newdata);

对于

   $id = $response['id_web_user'];
   $username = htmlspecialchars(sprintf('%s %s', $response['nombre_web_user'], $response['apellidos_web_user']));
   $newdata = array(
        'username'  => $username,
        'id_web_user' => $id,
        'logged_in' => TRUE
   );
   $this->session->set_userdata($newdata);      

请看一看,在我的上一个代码中,我仅从构建自定义会话的$response数组中获取了三个值,它们是:

$response['id_web_user']
$response['nombre_web_user']
$response['apellidos_web_user']

因此,我只取了树值,并将它们分别保存在各自的变量中,现在是:

$id = $response['id_web_user'];
$username = htmlspecialchars(sprintf('%s %s', $response['nombre_web_user'], $response['apellidos_web_user']));

请看一下,我在数组中添加了第三个值(如CodeIgniter示例),即'logged\u in'=

这对我很有效。

结论:我不得不说,在互联网上找到解决方案对我来说永远不起作用。我做的第一件事是在google上搜索为什么通过AJAX调用创建会话的方法不起作用,我发现了两种可能性:

  1. 似乎CodeIgniter自2014年以来有一个错误,当时会话通过AJAX创建,对于一个可能的解决方案,您需要将Session.php文件替换到文件夹system/Sessions.php。这个解决方案从来没有为我工作过,因为这个人在两个引用中建议的文件与我的CodeIgniter文件不匹配。

参考页:

Codeigniter会话不与AJAX工作

https://forum.codeigniter.com/thread-68010.html

参考页:

codeIgniter:登录后丢失会话数据

我希望我的回答足以让我告诉你这是什么以及如何解决我的问题。如果此答案中缺少某些内容,请告诉我以进行更新。谢谢

沙海
2023-03-14

你把这个图书馆叫做$this吗-

或者在application/config/autoload中调用此库。php文件使用$自动加载[“库”]=数组(“会话”);

 类似资料:
  • 这里的问题是我试图通过ajax登录到我的系统。让我给你的第一个解释一下。 当我的用户输入他的登录详细信息时,它将通过Ajax请求发送到服务器,然后在验证后,我创建一个会话条目,并保存用户ID和登录标志等信息。 然后我通过Json将这些值返回给用户,由一段javascript处理,并将用户重定向到仪表板。 如果用户未经身份验证,则显示错误。 但现在这里发生的是。当我创建会话变量时以及当用户重定向到仪

  • 问题内容: 我正在将DHTMLX网格导出到csv,并且已经能够成功创建.CSV文件。我遇到的问题是它没有提示用户保存/打开文件。我正在使用来自javascript的$ .post调用将CSV字符串发送到PHP,然后将该字符串写入csv。由于某种原因,它没有为用户创建提示,但它已成功写入文件并保存在服务器上。下面是相关代码: JS: PHP(export.php): 这段代码可以完全按照我的需要导出

  • 问题内容: 我有一个使用AJAX加载新php文件并更新显示的单页网站。 我从主页开始php会话,但是当我使用ajax更新内部html时,我需要这些会话变量来加载新的php文件。 这篇文章与此类似:PHP会话变量未保留。但是我检查了一下,我的php.ini有 主页PHP: 在用户输入之后,我使用ajax调用php文件并加载页面的一个小节: 有人可以告诉我我缺少哪些重要步骤吗?谢谢。 更新: 在主页和

  • 问题内容: 我将用户输入(在这种情况下,只是数量和产品代码)传递给php脚本,以通过ajax存储到会话数组中。我希望,每次用户单击“提交”并进行ajax调用时,数量和产品代码都会添加到会话数组中。但是现在发生的是,每次它更新会话中的现有数据时。因此,仅存在一对数据。 这是我的ajax脚本: 我的PHP sendToCart.php 问题答案: 每次进行ajax调用时,您都会覆盖会话变量。 您需要读

  • 所以我设置了一个汇流Kafka JDBC连接器。首先,我启动一个模式注册表,如 这是schema-registery.properties文件 接下来,我启动一个像这样的独立连接器 connect-avro-standalone.properties是 jdbc-source.properties是 我使用的查询只是为了测试的目的,我要使用的真正查询将实现增量模式,并且将不包含where子句。 我

  • About This app contains a CRUD interface for flower pots as well a notifier on when to water the flowers. Technologies used: Javascript jQuery Twitter Bootstrap PHP (with Codeigniter framework v3.1.4)