让getJSON与codeigniter一起工作时遇到麻烦

Trouble getting getJSON to work with codeigniter

本文关键字:遇到 麻烦 工作 一起 getJSON codeigniter      更新时间:2023-09-26

我试图使用getJSON,这样我就可以从我的数据库中获取最新的信息。到目前为止,我所做的是将它存储到一个数组和json_encode(the array)中。这是有效的,因为我可以看到视图上的信息,但问题是ajax方法没有接收它。也许我错过了一些非常愚蠢的东西。

控制器:

public function insertJSON()
{
    $this->load->model("values");
    $queryresults = $this->values->getDb(); 
    $arr = array();
    foreach($queryresults as $row)
    {
        $arr[] =  $row->postcode;
    }
    $data['arr'] = $arr;    
    echo json_encode($arr); 
    $this->load->view('answer', $data);
}

视图:

<html>
<head>
    <script src="http://code.jquery.com/jquery-1.7.1.min.js"></script>
    <script>
    <script>            
        $.post('/localhost/codeigniter/index.php/welcome/insertJSON', function(data) {
            alert(data);
        });
    </script>
    </script>
</head>
<body>
</body>
</html>

Var $arr变量的转储:

array(4) {
  [0]=>
  string(5) "test1"
  [1]=>
  string(5) "test2."
  [2]=>
  string(5) "test3"
  [3]=>
  string(5) "test4"
}

您正在发送$data数组(其中包含$arr)到视图通过调用它($this->load->view('answer', $data);),就在它之前你回显JSON数据。

所以你要做的是调用一个视图,在它的顶部,在任何html或javascript有一个纯文本包含json编码的$arr

这显然是错误的,而不是你想要的。

你应该做以下两个选择之一:

  1. 回显$arr在视图,<head>区段内的<script>标签。不过,您不必使用AJAX调用。
  2. 只是回显$arr在控制器上,但在它之后不调用视图。你应该可能会为此制作另一个控制器。一个响应$arr和一个调用视图。这样就可以对第一个对象进行AJAX调用控制器。
  3. $arr传递给一个视图,该视图将只返回JSON编码的数据。这类似于选项#2,但它使用View来显示数据而不是控制器,这是遵循MVC模式的最合适的方式。控制器不应该回显任何内容。

所以。如果您想要回显一个可以使用ajax拾取的JSON对象,那么您需要确保页面的输出mime类型可以提供JSON数据。

还要注意,你不能用json数据回显你想从函数中取出的任何其他内容。正如我可以看到在你的代码u echo json然后加载一个视图!你需要把它分成两个单独的页面

修复:

public function _JSON()
{
    $this->load->model("values");
    $queryresults = $this->values->getDb();
    $arr = array();
    foreach($queryresults as $row)
    {
       $arr[] =  $row->postcode;
    }
    return $arr;
}

public function json_body(){
    $this->load->view('answer',array('data'=>$this->_JSON()));
}

public function getJSON(){
    $this->output
    ->set_content_type('application/json')
    ->set_output(json_encode($this->_JSON()));
}
///note that $this->_JSON() now return ur $arr so u can use it in many methods.

现在加载页面,你可以去/json_body '重命名为你想要的'js应该是

<script>
$.post('<?=base_url('welcome/getJSON')?>', function(data) {
alert(data);
});
</script>
<!--notice that base_url show echo out ur url base on ur config.php file-->

注意:

function getJson get使用CI Output类的功能来设置页面的mime类型,并确保该数组是唯一的输出。这不是必须的,但它只是最佳实践。如果你想,你可以用简单的echo json_encode($this->_JSON());替换所有3行,它也会工作!

我猜问题出在你的帖子URL:

$.post('//localhost/codeigniter/index.php/welcome/insertJSON', function(data) {
   alert(data);
 });

您错过了双斜杠(//)