【问题标题】:Echo String dont work properly回声字符串无法正常工作
【发布时间】:2017-03-31 11:06:23
【问题描述】:

我正在使用 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).

【问题讨论】:

  • 你是如何获取这个脚本的输出的?通过浏览器或 CURL 之类的客户端?
  • 感谢您的快速回复。我正在通过浏览器对其进行测试。
  • 使用if( ! empty($priceCTP))保证变量$priceCTP不为空
  • @余家傲 谢谢指教
  • 控制器动作不应该回显数据!您应该准备请求对象或使用(数据)视图。话虽如此,请确保您提供的详细信息是正确的,从您的问题来看,好像在&Repon 之后会切断输出(即不仅仅是缺少价格)?

标签: php cakephp cakephp-2.3


【解决方案1】:

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

正如 cmets 中所提到的,控制器操作不应该回显数据,即使它可能在某些甚至大多数情况下都有效。输出数据的正确方法是使用(数据)视图,通过配置和返回响应对象,甚至返回一个字符串(但是与未来版本的 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 编码。

另见

【讨论】:

  • 感谢您的回复。我试过你的解决方案,输出在
     和 &Repon 之后被切断。我确信这是正确的方法,但我认为我错过了一些东西。 P.S 是的,钥匙应该是法语的。这是输出:
    Reference=123&Action=DETAIL&Repon
  • @Ninja 听起来您正在通过浏览器的 DOM 检查功能查看内容 - 这不会向您显示实际的原始内容(尤其是非 HTML)!确保改用源视图功能。如果您的内容仍然无法使用我的回答中提到的解决方案,那么您需要进一步调试,首先检查提到的 Content-Length 标头。 Content-Encoding 也可能参与其中。
  • 我很困惑。我做了一个 var_dump($body) 并且输出是: string(44) "Reference=123&Action=DETAIL&Reponse=1079,764" 但返回 $this->response;内容被截断:Reference=123&Action=DETAIL&Repon
  • @Ninja Via CakeResponse::length(),但你通常不会那样做!除非响应将通过 PHP 压缩,否则 CakePHP 会为您执行此操作。查看您的链接,您的服务器以相同的长度响应压缩和未压缩的响应,这就是问题的根源。您必须弄清楚在哪里涉及压缩(在服务器级别(例如mod_deflate),在 PHP 扩展级别(例如 zlib),在 PHP 代码级别(例如 CakeResponse::compress()),以及为什么它不相应地设置适当的长度。
  • 谢谢你!你让我今天一整天都感觉很好!!现在输出没有被切断。只是我必须删除
     以便支付系统正确读取输出。
猜你喜欢
  • 2017-01-22
  • 2017-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-06
  • 1970-01-01
  • 1970-01-01
  • 2015-12-03
相关资源
最近更新 更多