2015-01-16 2 views
0

Вот код, который вызывает ошибку:Почему только один сервер бросает ошибку «Array to String Conversion»?

 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, и я не могу поколебать ощущение, что в системе отсутствует основной компонент, который исправит это.

EDIT (дополнительная информация): На сервере вместо того, чтобы бросать ошибку, он отображает «Массив» вместо массива, если действительно существует массив в $ val. Я не хочу менять код, но, скорее, выясню, что может вызвать это.

ВЫХОД ИЗ РАБОЧЕЙ СЕРВЕРУ после выполнения ПОИСК:

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 

EDIT: исходные коды точно так же на обоих серверах.

Loaded модули 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) 
+0

Возможно, что '$ val' может быть массивом. – r3wt

+0

Попробуйте print_r ($ _ GET ['Inventory']); перед этим кодом, чтобы убедиться, что вход - это то, что вы ожидаете. Поскольку вы обрабатываете параметры URL, вполне возможно, что изменение сервера могло вызвать проблему без изменения php. –

+0

print_r используется для рекурсивной печати сложной переменной. Вы хотите просто напечатать, а не print_r. Итак, измените print_r на печать. Тогда очевидно, что одно из значений в массиве - это сам массив. Итак, хотя бы один раз, $ val является массивом. Вы не можете конкатенировать массив, как если бы это была строка. – kainaw

ответ

1

Вероятная ошибка на обоих серверах: вы пытаетесь вывести массив в виде строки. Это проблема, которую вы должны исправить. Вероятно, вы видите только сообщение на одном сервере, потому что этот сервер имеет более строгие настройки для переменной конфигурации PHP error_reporting.

Я предложил бы отделяя лесоруб линию в нечто вроде:

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

, который будет работать независимо от типов переменных.

+0

Это именно то, что я ищу, но, пожалуйста, подробнее расскажите о переменной 'error_reporting' (где я ее найду и как она установлена?). Мне просто нужно выяснить, почему один сервер реагирует иначе, чем другой, и настроить их одинаковыми. – Klik

+0

http://php.net/manual/en/errorfunc.configuration.php#ini.error-reporting - эти значения конфигурации управляют серьезностью ошибок, которые вы хотите сообщить PHP. Преобразование массива в строку не является особенно серьезной ошибкой, так как это вряд ли будет нарушением приложения. –

+0

Я собираюсь просто исправить код вместо изменения переменной. Я узнал, что это произошло из используемой версии PHP (один из них выполнял 5.3.10, а другой - 5.5.9). Я буду принимать это как ответ, если вы ссылаетесь на http://php.net/manual/en/function.error-reporting.php (он упоминает об изменении значения error_reporting по умолчанию от версии к версии), поскольку это был мой первоначальный вопрос и это станет хорошим ответом для будущих пользователей. – Klik

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); 

В частности, это будет работать с массивами просто отлично.

+0

Хотя это не отвечает на мой вопрос, я ценю предложение, так как это улучшение кода. – Klik

0

Как сказал Тим Фонтан, на одном из серверов был более строгий параметр для переменной error_reporting.

Произошло то, что я сделал новую установку Ubuntu 14.04, и с ней я установил все новейшие версии программного обеспечения, включая PHP 5.5. На другом сервере выполняется PHP 5.3. Как оказалось, PHP 5.5 имеет более строгую настройку error_reporting по умолчанию (см. here). Это отвечает ПОЧЕМУ ошибка была выброшена на один сервер, а не другой.

Есть несколько способов изменить эту настройку; можно было бы изменить параметр опции error_repoting в php.ini (/etc/php5/apache2/php.ini для меня). То, что я закончил, это то, что я изменил код, чтобы напечатать «Array», если переменная была массивом вместо того, чтобы пытаться конкатенировать ее, что и вызывало ошибку.