首页 文章

Echo String无法正常工作

提问于
浏览
0

我正在使用cakePHP 2.x.我正在尝试使用空布局渲染视图 . 视图应仅包含从操作控制器返回的字符串,不包含html代码 . 这是代码:

public function checkout(){

     $ref =null;$act=null;$par=null;

     $this->layout = false;
     //$this->render(false);

     //$priceCTP = $this->Session->read('priceCTP');;
     $priceCTP = $this->getPrice();
     //var_dump(session_save_path());

     if (isset($this->params['url']['Reference'])) {
         $ref = $this->params['url']['Reference'];
     }
     if (isset($this->params['url']['Action'])) {
         $act = $this->params['url']['Action'];
     }
     if (isset($this->params['url']['Param'])) {
         $par = $this->params['url']['Param'];//$_GET['Param'];//this->request->params['named']
     }
     switch ($act) {
         case "DETAIL":// accéder à la base et récuperer le montant
             echo "Reference=".$ref."&Action=".$act."&Reponse=".$priceCTP;
             break;
         case "ERREUR": // accéder à la base et mettre à jour l’état de la transaction
             echo "Reference=".$ref. "&Action=".$act. "&Reponse=OK";
             break;
         case "ACCORD": // accéder à la base, enregistrer le numéro d’autorisation (dans param)
             echo "Reference=".$ref. "&Action=".$act. "&Reponse=OK";
             break;
         case "REFUS":  // accéder à la base et mettre à jour l’état de la transaction
             echo "Reference=".$ref. "&Action=".$act. "&Reponse=OK";
             break;
         case "ANNULATION":  // accéder à la base et mettre à jour l’état de la transaction
             echo "Reference=".$ref. "&Action=".$act. "&Reponse=OK";
             break;
     }
}

这个网址的结果(http://mydomain/orders/checkout

Reference=123&Action=DETAIL&Param=)

"Reference=123&Action=DETAIL&Repon"
rather than 
"Reference=123&Action=DETAIL&Reponse=121,630" (works fine on localhost).

1 回答

  • 0

    不要回显控制器的数据

    正如评论中所提到的,控制器操作不应该回显数据,即使它可能在某些情况下工作,甚至可能在大多数情况下工作 . 输出数据的正确方法是使用(数据)视图,配置并返回响应对象,甚至返回一个字符串(但不能与CakePHP的未来版本向前兼容) .

    回显数据可能会导致各种问题,从未在测试环境中识别的数据到无法发送的标头,甚至数据被切断,这正是您所遇到的问题 . 后者可以例如在 Content-Length 标头中发送的大小与正在发送的数据的实际大小不匹配时发生,这通常发生在内容被gzip压缩的情况下 .

    内容 - 长度不匹配可能是原因

    如果你遇到了gzipped响应问题的长度不匹配问题,那么你必须在PHP代码级别(在PHP扩展级别(例如 zlib )上找出涉及压缩的位置(在服务器级别(例如 mod_deflate ))(例如 CakeResponse::compress() )),以及为什么它没有相应地设置适当的长度 .

    正确的控制器动作逻辑

    话虽如此,只需将所需数据传递给视图,然后从那里构建并回显响应数据 . 鉴于您不想使用HTML进行响应,您可能还需要相应地设置响应类型:

    public function checkout()
    {
        $this->response->type('text'); // = text/plain
    
        // ...
    
        $this->set(compact(array('priceCTP', 'ref', 'act', 'par')));
    }
    

    如上所述,另一种选择是返回一个正确的响应对象:

    public function checkout()
    {
        $this->response->type('text');
    
        // ...
    
        $body = "Reference=" . $ref . "&Action=" . $act . "&Reponse=";
        switch ($act) {
            case "DETAIL":
                $body .= $priceCTP;
                break;
    
            case "ERREUR":
            case "ACCORD":
            case "REFUS":
            case "ANNULATION": 
                $body .= "OK";
                break;
    
            // ...
        }
    
        // ...
    
        $this->response->body($body);
        return $this->response;
    }
    

    PS . 你真的想用法语的钥匙回复吗? Reponse 也许应该是 Response .

    PPS . 鉴于您使用查询字符串进行响应,您可能需要/需要对值进行相应的URL编码 .

    也可以看看

    • Cookbook > Controllers > Controller actions

    • Cookbook > Controllers > Request > Request and Response objects > CakeResponse > Dealing with content types

相关问题