回声字符串不能正常工作

Echo String dont work properly

我正在使用 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;
     }
}

这个 url(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).

不回显来自控制器的数据

如评论中所述,控制器操作不应该回显数据,即使它在某些甚至大多数情况下可能有效。输出数据的正确方法是使用(数据)视图,通过配置和 return 响应 object,甚至 returning 一个字符串(但是与未来不向前兼容CakePHP).

的版本

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

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')));
}

如前所述,另一种选择是 return 正确回应 object:

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。鉴于您使用查询字符串进行响应,您可以 want/need 到 URL 相应地对值进行编码。

另见