为什么只有一个服务器抛出错误"数组到字符串转换"?

时间:2015-01-16 15:41:31

标签: php apache ubuntu lamp

以下是导致错误的代码:

        foreach($_GET['Inventory'] as $fld => $val) {
           print_r("Field: " . $fld . " Value: " . $val . '</br>');
            if($val != '' && !is_null($val))
                if($fld != 'searchoption')
                    $perma .=  $fld . '=' . $val . '&';
        } 

print_r()是错误的原因,但我只在一台服务器上收到此错误。这台服务器最近经历了新的Ubuntu安装(升级到14.04全新安装)和LAMPP。这与其他正在运行的源代码相同(据我所知)源代码,但由于某种原因,此错误在此持续存在。

我不熟悉php-apache模块,我不能动摇系统缺少一个可以解决这个问题的核心组件的感觉。

编辑(更多信息):如果在$ val中确实有一个数组,那么在服务器上一个而不是抛出错误它会在数组的位置显示“Array”。我不打算改变代码,而是找出可能导致这种情况的原因。

搜索后从工作服务器输出:

Field: searchoption Value: Array
Field: parentBarcode Value:
Field: barcode Value:
Field: room Value:
Field: fixedAssetTag Value:
Field: hostDomainName Value:
Field: ipAddress Value: test
Field: macAddress Value:
Field: serialNumber Value:
Field: purchaseOrder Value:
Field: accountNumber Value:
Field: searchscope Value: 1

编辑:两个服务器上的源代码完全相同。

在不工作的服务器上加载Apache模块:

//both servers have these modules loaded
=   core_module (static)                        
=   so_module (static)      
=   http_module (static)
=   log_config_module (static)
=   logio_module (static)
=   alias_module (shared)
=   auth_basic_module (shared)
=   authn_file_module (shared)
=   authz_host_module (shared)
=   authz_user_module (shared)
=   autoindex_module (shared)
=   cgi_module (shared)
=   deflate_module (shared)
=   dir_module (shared)
=   env_module (shared)
=   mime_module (shared)
=   mpm_prefork_module (shared)
=   negotiation_module (shared)
=   php5_module (shared)
=   setenvif_module (shared)
=   status_module (shared)

//Server with error has these extra modules loaded
+   authz_core_module (shared)
+   authn_core_module (shared)
+   version_module (static)
+   unixd_module (static)
+   access_compat_module (shared)
+   rewrite_module (shared)     
+   watchdog_module (static)
+   filter_module (shared)

//Working server has these extra modules loaded
- authz_groupfile_modeul (shared)
- authz_default_module (shared)
- reqtimeout_module (shared)

3 个答案:

答案 0 :(得分:1)

虽然这本身并没有回答这个问题,但我想提出一个更好的方法。

看起来您的代码正在尝试获取$_GET['Inventory']的内容并从中创建查询字符串,忽略所有空白条目以及密钥searchoption

试试这段代码:

$inventory = $_GET['Inventory'];
$inventory = array_filter($inventory); // remove blanks
if( isset($inventory['searchoption'])) unset($inventory['searchoption']);
$result = http_build_query($inventory);

特别是,这将很好地处理数组。

答案 1 :(得分:1)

两个服务器上可能存在错误:您尝试将数组作为字符串输出。这是你应该解决的问题。您可能只在一台服务器上看到错误 message ,因为此服务器对PHP配置变量error_reporting有更严格的设置。

我建议将记录器线分成如下:

print_r($fld);
print_r($val);

无论变量类型如何都可以使用。

答案 2 :(得分:0)

正如Tim Fountain所说,其中一台服务器对error_reporting变量设置了更严格的设置。

我刚刚安装了Ubuntu 14.04,并安装了所有最新的软件版本,包括PHP 5.5。另一台服务器运行PHP 5.3。事实证明,PHP 5.5默认具有更严格的error_reporting设置(参见here)。这回答了 WHY 错误是在一台服务器而不是另一台服务器上抛出的。

有几种方法可以更改此设置;一个是改变php.ini中的error_repoting选项设置(/etc/php5/apache2/php.ini对我来说)。我最后做的是如果变量是一个数组而不是尝试连接它,我改变了代码来打印“Array”,这就是导致错误抛出的原因。