PHP ksort() 函数在远程服务器上根本不排序。也不报错
Posted
技术标签:
【中文标题】PHP ksort() 函数在远程服务器上根本不排序。也不报错【英文标题】:PHP ksort() function is not sorting at all on remote server. Throws no error either 【发布时间】:2014-02-22 21:07:00 【问题描述】:我正在编写一个 php 函数,该函数接受一组 $_GET 参数并吐出这些参数的 SHA 签名(加了秘密)以验证真实性。
目前看起来是这样的:
private function generateShasign($fields)
unset($fields['SHASIGN']);
ksort($fields, SORT_NATURAL | SORT_FLAG_CASE);
$phrase = "";
foreach($fields as $key => $field)
// if(!empty($field) && $field != '0')
$phrase .= strtoupper($key) . '=' . $field . 'SECRETSALT';
//
return strtoupper(sha1($phrase));
它从请求中取消设置 SHA-SIGNATURE 参数,将它们置于“KEY=value.SECRETSALT”格式并对其进行排序(使用 ksort())
现在,这在我的本地环境中非常有效。返回的 SHA 等于 get 请求中的 SHA var,一切正常。
但是,在远程测试服务器上,它不起作用。 Ksort 似乎根本没有排序。而且它不会引发错误。
快速 print_r($phrase) 返回(在有故障的远程服务器上):
SHA SIGN: ORDERID=ge9xBpZjXSECRETSALTCURRENCY=EURSECRETSALTAMOUNT=50SECRETSALTPM=CreditCardSECRETSALTACCEPTANCE=test123SECRETSALTSTATUS=5SECRETSALTCARDNO=XXXXXXXXXXXX1111SECRETSALTED=0214SECRETSALTCN=MATTHIASSECRETSALTTRXDATE=02/22/14SECRETSALTPAYID=28345877SECRETSALTNCERROR=0SECRETSALTBRAND=VISASECRETSALTIP=84.198.21.23SECRETSALT7F0B539A1DECC55E57860DEB9F7B3A301E1960AD
关于适当的工作环境:
ACCEPTANCE=test123SECRETSALTAMOUNT=50SECRETSALTBRAND=VISASECRETSALTCARDNO=XXXXXXXXXXXX1111SECRETSALTCN=MATTHIASSECRETSALTCURRENCY=EURSECRETSALTED=0214SECRETSALTIP=84.198.21.23SECRETSALTNCERROR=0SECRETSALTORDERID=iXAVBM1SBSECRETSALTPAYID=28345882SECRETSALTPM=CreditCardSECRETSALTSTATUS=5SECRETSALTTRXDATE=02/22/14SECRETSALT
显然, ksort() 不会对远程环境中的任何内容进行排序。因此,为什么要sha-encoded短语中的参数顺序与GET请求中的顺序完全相同。
为什么 ksort() 不起作用并且不抛出错误让我很困惑。
我在本地运行 PHP/5.4.22 (Apache)。并且远程我相信- PHP 5.3 (nginx)
更新:
ksort 返回错误。无法弄清楚为什么它失败了。
非常感谢任何帮助!
【问题讨论】:
你确定在远程服务器上打开了错误报告?通过添加ini_set('display_errors', '1'); error_reporting(E_ALL);
进行测试
这不是 ksort 的问题。您的“故障”服务器正在输入不同的数据。您需要发送var_dump($fields)
,然后跟踪该数据的来源。
有点离题,但您应该考虑使用与生产环境中使用的相同版本的软件。如果您的实时服务器使用 PHP 5.3,您应该使用 PHP 5.3 进行开发。这样可以避免很多问题。最好的方法是使用Vagrant。您可以使用PuPHPet 生成配置。
@cale_b:是的,我完全确定错误报告已打开。其他错误确实会生成 PHP 通知,但这个错误不会。即使在应用这些行之后也没有
@Marc B:久经考验。 $fields 变量在两种环境中完全相同。 ksort() 的输出不是。没有给出警告/通知的事实让我觉得我错过了一些明显的东西......
【参考方案1】:
我们开始吧:
http://php.net/ChangeLog-5.php#5.4.0
Added support for SORT_NATURAL and SORT_FLAG_CASE in array sort functions (sort, rsort, ksort, krsort, asort, arsort and array_multisort).
【讨论】:
嗯,我实际上在文档中阅读了几次这些行......被 Ksort() 标题下的“(PHP 4, PHP 5)”标志弄糊涂了。谢谢!【参考方案2】:SORT_NATURAL 和 SORT_FLAG_CASE 在远程环境中不起作用。出于watherver的原因,我不知道。 SORT_STRING 但是正在工作。所以我通过首先将键转换为大写,然后使用 SORT_STRING 排序来解决我的问题。
不能解决问题,但我想这是一个可行的解决方法。
【讨论】:
以上是关于PHP ksort() 函数在远程服务器上根本不排序。也不报错的主要内容,如果未能解决你的问题,请参考以下文章