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() 函数在远程服务器上根本不排序。也不报错的主要内容,如果未能解决你的问题,请参考以下文章

php 数组排序

php 编程 :怎样把数组中的元素按键名大小排列

PHP 数组排序 +php二维数组排序方法

ksort 函数

PHP会话根本不起作用

从远程函数调用中获取字符串值