Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
CakePHP 3:无法从控制器获取JSON数据_Php_Jquery_Json_Ajax_Cakephp - Fatal编程技术网

CakePHP 3:无法从控制器获取JSON数据

CakePHP 3:无法从控制器获取JSON数据,php,jquery,json,ajax,cakephp,Php,Jquery,Json,Ajax,Cakephp,我试图将控制器中的查询返回到视图文件,以便在表单中使用该数据。但是我无法成功地返回没有错误的数据。我知道该函数正在工作,因为它返回正确的数据,但有一个错误 这是我的CustomerController填充函数,它正在运行sql查询 public function fill(){ $layout = 'ajax'; $this->autoRender = false; if ($this->request->is('post'))

我试图将控制器中的查询返回到视图文件,以便在表单中使用该数据。但是我无法成功地返回没有错误的数据。我知道该函数正在工作,因为它返回正确的数据,但有一个错误

这是我的CustomerController填充函数,它正在运行sql查询

public function fill(){
        $layout = 'ajax';
        $this->autoRender = false;
        if ($this->request->is('post')) {
            $id = $this->request->data['id'];
            $query = $this->Customers->find()
            ->where([
               'id' => $id
            ])->first();
            echo json_encode($query);  
       }  
}
这是我的blah.ctp,它是视图文件

<?php use Cake\Routing\Router; ?>
<?= $this->Form->create(Null, ['type' => 'POST']) ?>
<?php
    echo $this->Form->input('customer_id', ['options' => $customers, 'empty' => true,'id'=>'customers']);
?>
<?= $this->Form->end() ?>

<script>
document.getElementById('customers').addEventListener('change',function(){
   var id = this.value;
    var csrfToken = $('[name=_csrfToken]').val();
    $.ajax({
        type: "POST",
        url: '<?php echo Router::url(array("controller" => "Customers", "action" => "fill")); ?>',
        data: {'id' : id},
        beforeSend: function(xhr){
           xhr.setRequestHeader('X-CSRF-Token', csrfToken);
        },
        success: function(data){
            alert(data);
        }
    });
});
</script>

document.getElementById('customers')。addEventListener('change',function(){
var id=这个值;
var csrfToken=$('[name=_csrfToken]')。val();
$.ajax({
类型:“POST”,
url:“”,
数据:{'id':id},
发送前:函数(xhr){
xhr.setRequestHeader('X-CSRF-Token',csrfToken);
},
成功:功能(数据){
警报(数据);
}
});
});
目前,当我在下拉框中选择一个客户时会发生这种情况,该客户会触发视图中的脚本。 正如您所看到的,它返回了我需要的数据数组,但也有一个错误,即无法发送头。我已经尝试解决了这个错误,下面是关于堆栈溢出的其他问题,但无法解决它。
我尝试使用$this->set代替echo json_encode,但它总是不返回任何结果。我不知道还有什么其他方法可以做到这一点。

首先,如果您使用唯一ID选择一条记录,您可以调用 直接在表对象上获取($id),而不是使用
->find()
构建查询链

CakePHP3.x应该通过使用RequestHandlerComponent自动处理视图到JSON的转换。通常,如果您的脚手架或安装没有启用,您必须启用它

1) 启用请求处理程序组件。(如果尚未启用)

2) 删除
echo json\u encode($query)
行;您不应该回显任何内容,因为这将打破请求/响应周期。这就是你犯错误的原因。 相反,您应该将数据序列化到视图中。假设您在$data中获取了数据:
$this->set(compact('data'))
。然后,确保添加
$this->set(“\u serialize',['data'])
(同样,假设数据存储在变量名“data”中)

3) 有关如何请求json的信息,请参考此文档。您可以使用文件扩展名(.json、.xml)。 另外,请确保将“Accept:application/json”头添加到请求中。(\Routing\Router::extensions)


我为模糊的回答道歉。有很多方法可以通过CakePHP3实现这一点。请查看此文档页面以了解更多信息:

您看到此线程了吗?哦,我忘记了请求处理程序,但遗憾的是,当我以前尝试$this->set时,它并没有起到任何作用,它仍然不向视图返回任何内容,并且说没有可用的响应。也谢谢你的第一个提示。我忘了检查你的请求标题。请确保您的请求中有“Accept:application/json”。请求标题当前只显示“Accept:/”是否需要修改控制器?只要您将控制器更改为使用
$this->set()
并序列化,控制器就应该正常。只需将Accept:application/json头添加到您的javascript.hmm中,我将头:{Accept:application/json}添加到我的脚本中,它修复了请求头,但我仍然得到了空白数据。