回声字符串不能正常工作
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 相应地对值进行编码。
另见
我正在使用 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 相应地对值进行编码。
另见