0

我正在尝试使用 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>

$arr 变量的 Var 转储:

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

3 回答 3

1

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

因此,您要做的是在其顶部调用一个视图,在任何 html 或 javascript 具有包含 json 编码的纯文本之前$arr

这显然是错误的,而不是您要寻找的。

您应该执行以下任一选项:

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

我建议遵循选项#3。

于 2013-03-18T00:41:23.977 回答
1

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

还请注意,您无法使用您想要的 json 数据从您的函数中回显任何其他内容。正如我在你的代码中看到的,你 echo json 然后加载一个视图!你需要把它分成2个单独的页面

使固定:

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-->

笔记:

函数 getJson get 使用 CI 输出类的力量来设置页面的 mime 类型,并确保这个数组是唯一的输出。这不是必须的,但它只是最佳实践。如果你愿意,你可以用简单的方式重复所有 3 行,echo json_encode($this->_JSON());它也可以工作!

于 2013-03-18T00:41:41.413 回答
0

我想问题是您的帖子网址:

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

你错过了双斜杠 (//)

于 2013-03-18T00:23:17.660 回答