Вот код, вызывающий ошибку:
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)
Вероятно, ошибка существует на обоих серверах: вы пытаетесь вывести массив в виде строки. Это проблема, которую вы должны исправить. Вероятно, вы видите сообщение об ошибке только на одном сервере, потому что этот сервер имеет более строгие настройки для переменной конфигурации error_reporting
.
Я бы предложил разделить строку журнала на что-то вроде:
print_r($fld);
print_r($val);
который будет работать независимо от типов переменных.
error_reporting
(где я могу найти ее и как она установлена?). Мне просто нужно выяснить, почему один сервер реагирует не так, как другой, и настроить их так, чтобы они были одинаковыми.
Хотя это не отвечает на вопрос как таковой, я хотел бы предложить лучший способ.
Похоже, ваш код пытается получить содержимое $_GET['Inventory']
и создать из них строку запроса, игнорируя все пустые записи, а также ключевое searchoption
.
Попробуйте этот код:
$inventory = $_GET['Inventory'];
$inventory = array_filter($inventory); // remove blanks
if( isset($inventory['searchoption'])) unset($inventory['searchoption']);
$result = http_build_query($inventory);
В частности, это прекрасно справится с массивами.
Как сказал Тим Фонтан, на одном из серверов была более строгая настройка для переменной 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", если переменная была массивом вместо того, чтобы пытаться конкатенировать ее, что и вызывало ошибку.
$val
может быть массивом.