Почему только один сервер выдает ошибку «Преобразование массива в строку»?

0

Вот код, вызывающий ошибку:

        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: Исходные коды на обоих серверах одинаковы.

Загруженные модули 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 может быть массивом.
  • 0
    Попробуйте print_r ($ _ GET ['Inventory']); перед этим кодом, чтобы убедиться, что ввод, что вы ожидаете. Поскольку вы обрабатываете параметры URL, вполне возможно, что изменение сервера могло вызвать проблему без изменения php.
Показать ещё 2 комментария
Теги:
lamp

3 ответа

1
Лучший ответ

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

Я бы предложил разделить строку журнала на что-то вроде:

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

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

  • 0
    Это именно то, что я ищу, но, пожалуйста, уточните больше о переменной error_reporting (где я могу найти ее и как она установлена?). Мне просто нужно выяснить, почему один сервер реагирует не так, как другой, и настроить их так, чтобы они были одинаковыми.
  • 0
    php.net/manual/en/… - эти значения конфигурации управляют серьезностью ошибок, о которых PHP должен сообщать. Преобразование массива в строку не является особенно серьезной ошибкой, поскольку вряд ли это приведет к повреждению приложения.
Показать ещё 1 комментарий
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
    Хотя это не отвечает на мой вопрос, я ценю это предложение, так как это улучшение кода.
0

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

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню