Echo String无法正常工作

时间:2017-03-31 11:06:24

标签: php cakephp cakephp-2.3

我正在使用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 :(得分:0)

不要回显来自控制器的数据

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

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

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

如果您遇到gzip响应问题的长度不匹配问题,那么您必须弄清楚涉及压缩的位置(在服务器级别(例如mod_deflate),在PHP扩展级别上(对于示例zlib),在PHP代码级别(例如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编码。

另见