【问题标题】:Codeigniter controller variable lost after changeCodeigniter 控制器变量在更改后丢失
【发布时间】:2014-01-08 14:13:48
【问题描述】:

我有一个简单的 jquery 进度条,它应该从 Codeigniter 控制器获取一个变量并将其打印在屏幕上。 问题是当一个函数改变这个变量时,结果会丢失,所以进度条显示为 0。

这是我的代码:

class Emails extends CI_Controller {

public $p;
...

public function test()
{
    for ($i=0; $i < 1000000; $i++)
    { 
        $this->setprogress($i);
    }
}
public function setprogress($value)
    {
        $this->p = intval($value); 
}

public function progress()
{
    print $this->p;
}

在 jquery 中

function getProgress(){
    $.get('<?=site_url("/emails/progress"); ?>', function(data) {
        percent = (parseInt(data));
    });
}

$(document).ready(function(){
    $.get('<?=site_url("/emails/test"); ?>', function(parsing) {});
    interval = setInterval(getProgress, 100);
});

进度变量总是返回为空 (NaN)。 有什么建议么? 非常感谢各位。

【问题讨论】:

  • 使用这段代码我真的看不出问题出在哪里,你只是在打印 $this->p,但你没有设置它,你得到/emails/progress,但我没有'看不到你在哪里设置变量 $this->p;只需执行 $this->p = 1;在打印 $this->p; 之前只是为了调试它
  • 在 DOMReady 上,我通过 ajax 调用函数 test(),它根据其中的 for 循环设置 $this->p。
  • 每次你做一个ajax调用它都会初始化你的“控制器”; 2 次 ajax 调用 = 2 次请求,将数据保存到 CI 缓存、会话、数据库、文件 w/e 或更改您的设计!
  • 好的,这是有用的信息。谢谢!你有什么建议我可以在不一遍又一遍地调用测试函数的情况下改变它吗?
  • 我没有足够的代码信息,但我真的不认为你有更好的选择。

标签: javascript php jquery codeigniter progress-bar


【解决方案1】:

这是正确的解决方案。感谢Jorge Faianca 的大提示

public function __construct()
{
    parent::__construct();
    $this->load->library('session');
}

public function test()
{
    for ($i=0; $i < 100; $i++) { 
        $this->setprogress($i);
    }
}

function setprogress($value)
{
    $this->session->set_userdata('progress', intval($value)); 
}

public function progress()
{
    print $this->session->userdata('progress'); 
}

【讨论】:

    【解决方案2】:

    正如我在评论中解释的那样,您可以这样做。 (使用 Code Igniter 中的会话库而不是原生会话库)

    public function test()
    {
        for ($i=0; $i < 1000000; $i++)
        { 
            $this->setprogress($i);
        }
    }
    public function setprogress($value)
    {
         $_SESSION['progress'] = intval($value); 
    }
    
    public function progress()
    {
        echo $_SESSION['progress'];
    }
    

    【讨论】:

    • 它是 CodeIgniter 伙伴。我很确定它已经为你做到了。
    • 我不确定,但 CodeIgniter 不使用本机会话。他们使用完全不同的机制。你没有使用他们的会话库,你使用的是本地会话,所以我相信你必须这样做。
    • 我猜你是对的,使用 CI 的 Session 就可以了,没关系,只是一个例子。
    • 感谢 Jorge,很好的解决方案。其他的,请参考我上一篇在 Codeingniter 中工作的解决方案
    猜你喜欢
    • 1970-01-01
    • 2018-04-09
    • 1970-01-01
    • 1970-01-01
    • 2015-03-07
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    相关资源
    最近更新 更多