ошибка PHP Warning: array_key_exists()

  • Автор темы yura_co
  • Дата начала
yura_co

yura_co

master
#1
Пока гулял бродил , прилетело пару ошибок и если с ошибкой:
PHP Notice: Undefined index: payment_method in /wst.in.ua/catalog/controller/extension/payment/bank_transfer.php on line 14
более менее всё понятно, то вот ошибка

PHP Warning: array_key_exists(): The first argument should be either a string or an integer in /wst.in.ua/storage/modification/catalog/controller/startup/startup.php on line 67


сбила меня с толку
Но ошибки не повторяются и скорее всего носят случайный характер.
 
ТС
yura_co

yura_co

master
Топик Стартер #3
Вибачаюсь, не подумавши написав, помилка в ленгвічдетекті
Код:
66 // Language Detection
67        if (!empty($this->request->server['HTTP_ACCEPT_LANGUAGE']) && !array_key_exists($code, $languages)) {
68           $detect = '';
69           
70           $browser_languages = explode(',', $this->request->server['HTTP_ACCEPT_LANGUAGE']);
помилка викликана ботом від Г.
 
S

SlaSoft

Maestro
#4
хм



Код:
        // Language
        $code = '';
        
        $this->load->model('localisation/language');
        
        $languages = $this->model_localisation_language->getLanguages();
        
        if (isset($this->session->data['language'])) {
            $code = $this->session->data['language'];
        }
                
        if (isset($this->request->cookie['language']) && !array_key_exists($code, $languages)) {
            $code = $this->request->cookie['language'];
        }
        
        // Language Detection
        if (!empty($this->request->server['HTTP_ACCEPT_LANGUAGE']) && !array_key_exists($code, $languages)) {
            $detect = '';

Т.е.
$code = ''; - строка

Может быть
$code = $this->session->data['language'];

Хм.. откуда не строка и не инт

if (isset($this->request->cookie['language']) && !array_key_exists($code, $languages)) {
$code = $this->request->cookie['language'];
}

Упс.. ошибка не здесь , значит нет куки

Прикольно
 
ТС
yura_co

yura_co

master
Топик Стартер #5
как это нет куки?
Код:
 [HTTP_ACCEPT] => */*
    [HTTP_ACCEPT_ENCODING] => gzip,deflate,br
    [HTTP_ACCEPT_LANGUAGE] => en-US
    [HTTP_CONNECTION] => keep-alive
    [CONTENT_LENGTH] => 0
    [HTTP_COOKIE] => OCSESSID=a44a120fd7bddd9e59e2c3d7c8
    [HTTP_HOST] => wst.in.ua
    [HTTP_REFERER] => https://wst.in.ua/ru/krepleniya-stojki-dlya-tv-i-audio/itech-celb-54l-w.html
    [HTTP_USER_AGENT] => Mozilla/5.0 (Linux; Android 6.0.1; Nexus 5X Build/MMB29P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.108 Mobile Safari/537.36 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)
    [HTTP_FROM] => googlebot(at)googlebot.com
 
Последнее редактирование:
Baco

Baco

architect
#7
PHP Warning: array_key_exists(): The first argument
вказує на перший аргумент в методі array_key_exists, та підказує, що повинен бути або стрічка або число (ціле), отже халепа при перевірці тут: $code, тобто додатково проставити на if (isset||!empty||is_string||is_int)
 
Последнее редактирование:
ТС
yura_co

yura_co

master
Топик Стартер #10
то може яка помилка випадкова? може то глюк сервера який? помилка не повторюється ж
все що маю по помилці:
Код:
    [PATH] => /usr/local/bin:/usr/bin:/bin
    [TEMP] => /tmp
    [TMP] => /tmp
    [PWD] => /
    [HTTP_ACCEPT] => */*
    [HTTP_ACCEPT_ENCODING] => gzip,deflate,br
    [HTTP_ACCEPT_LANGUAGE] => en-US
    [HTTP_CONNECTION] => keep-alive
    [CONTENT_LENGTH] => 0
    [HTTP_COOKIE] => OCSESSID=a44a120fd7bddd9e59e2c3d7c8
    [HTTP_HOST] => wst.in.ua
    [HTTP_REFERER] => https://wst.in.ua/ru/krepleniya-stojki-dlya-tv-i-audio/itech-celb-54l-w.html
    [HTTP_USER_AGENT] => Mozilla/5.0 (Linux; Android 6.0.1; Nexus 5X Build/MMB29P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.108 Mobile Safari/537.36 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)
    [HTTP_FROM] => googlebot(at)googlebot.com
    [HTTP_X_HTTPS] => 1
    [REDIRECT_REDIRECT_UNIQUE_ID] => XyThhVvPPBUAKOGy--IAAAAP
    [REDIRECT_REDIRECT_SCRIPT_URL] => /ns-cache/_dc820c2e17eace63e777aa1039c3a82f.js
    [REDIRECT_REDIRECT_SCRIPT_URI] => https://wst.in.ua/ns-cache/_dc820c2e17eace63e777aa1039c3a82f.js
    [REDIRECT_REDIRECT_HTTPS] => on
    [REDIRECT_REDIRECT_SSL_TLS_SNI] => wst.in.ua
    [REDIRECT_REDIRECT_REQUEST_METHOD] => GET
    [REDIRECT_REDIRECT_STATUS] => 404
    [REDIRECT_UNIQUE_ID] => XyThhVvPPBUAKOGy--IAAAAP
    [REDIRECT_SCRIPT_URL] => /ns-cache/_dc820c2e17eace63e777aa1039c3a82f.js
    [REDIRECT_SCRIPT_URI] => https://wst.in.ua/ns-cache/_dc820c2e17eace63e777aa1039c3a82f.js
    [REDIRECT_HTTPS] => on
    [REDIRECT_SSL_TLS_SNI] => wst.in.ua
    [REDIRECT_STATUS] => 404
    [UNIQUE_ID] => XyThhVvPPBUAKOGy--IAAAAP
    [SCRIPT_URL] => /ns-cache/_dc820c2e17eace63e777aa1039c3a82f.js
    [SCRIPT_URI] => https://wst.in.ua/ns-cache/_dc820c2e17eace63e777aa1039c3a82f.js
    [HTTPS] => 1
    [SSL_TLS_SNI] => wst.in.ua
    [SERVER_SIGNATURE] =>
    [SERVER_SOFTWARE] => Apache mod_bwlimited/1.4
    [SERVER_NAME] => wst.in.ua
    [SERVER_ADDR] => 91.207.60.21
    [SERVER_PORT] => 443
    [REMOTE_ADDR] => 66.249.79.153
    [DOCUMENT_ROOT] => /home/u13810/public_html/wst.in.ua
    [SERVER_ADMIN] => webmaster@wst.ua1.d5.com.ua
    [SCRIPT_FILENAME] => /wst.in.ua/index.php
    [REMOTE_PORT] => 38928
    [REDIRECT_QUERY_STRING] => _route_=404.shtml
    [REDIRECT_URL] => /404.shtml
    [SERVER_PROTOCOL] => HTTP/1.1
    [REQUEST_METHOD] => GET
    [QUERY_STRING] => _route_=404.shtml
    [REQUEST_URI] => /ns-cache/_dc820c2e17eace63e777aa1039c3a82f.js
    [SCRIPT_NAME] => /index.php
    [PHP_SELF] => /index.php
    [REQUEST_TIME_FLOAT] => 1596252549.9663
    [REQUEST_TIME] => 1596252549
 
S

SlaSoft

Maestro
#11
спробую детальний на демо поставити, кожну змінну на print_r поставлю, глянемо що до чого.
Я з такою помилкою ще не зустрічався ніколи
Це ядро OC
Параметр key может быть любым значением, которое подходит для индекса массива.
key может быть либо типа integer, либо типа string. value может быть любого типа.
возможно, произошла ошибка декодирования сессии и вернул в $_SESSION false
 
ALarik

ALarik

expert
#12
поставить на валидацию в этом месте:
Код:
if (isset($this->request->cookie['language']) && !empty($code) && !array_key_exists($code, $languages)) {
     $code = $this->request->cookie['language'];
}
доп. проверку: && !empty($code)
 
ALarik

ALarik

expert
#16
для сравнения по ключу, пох какой тип, главное - чтобы он был (там же ж указано, что тип или целое или строка может быть, а его вообще нема), не хочу спорить, но в некоторых моментах - я доверяю тебе, но тут я с уверенностью могу сказать, где зарыт котёнок.

p.s.
Параметр key (в нашем случае $code) может быть любым значением, которое подходит для индекса массива.
пруф оф концепт
 
Baco

Baco

architect
#17
ошибка декодирования сессии и вернул в $_SESSION false
досить ймовірно, що ось на цих рядках і стається халепа:
Код:
        if (isset($this->session->data['language'])) {
            $code = $this->session->data['language'];
        }
                
        if (isset($this->request->cookie['language']) && !array_key_exists($code, $languages)) {
            $code = $this->request->cookie['language'];
        }
наразі немає дебагу на помилку на демо, будем очікувати, @ALarik справа не в тому, що десь валідація хромає, а в тому - що десь значення заміняється на некорректне, що і викликає помилку, тільки визначити потрібно, то віт краулера чи від користувача породжується запис в журнал.
 
ALarik

ALarik

expert
#20
ну, исходя из общей логики сверки кода печенюшек:
опенкарт печеньки
с массивом, который формируется в методе тут:
модуль языков опенкарт
то вполне можно тогда заменить с !empty($code) на is_string($code), но вопрос: в том ли месте поиск, я предполагаю, что ТС - не всю инфу показал, а стоило узнать хотя бы +\- 3 строки с ошибками вверх и вниз, от проблемного startup.php on line 67, тогда можно было бы объективно глянуть на проблему, у меня на одном из проектов - выскочило в контроллере seo_bro трабл, по логике - прошелся и на гитхабе поисправлял, добавив дебаг, проблемной переменной, посмотрим, что да как будет по поведению (фиксы на GitHub)
 
ALarik

ALarik

expert
#22
понял, но всеравно ошибка DEBUG_err_131L_CatalogControllerStartupSeoBro в журнале ошибок, пусть укажет при поиске на этот ответ, и понимая, кто придет и отпишет о ней, попробуем как то локализировать её, пока что у меня так же 1-н раз замечено было, но фиксы выкатил, будем бдеть :cool:
 
ТС
yura_co

yura_co

master
Топик Стартер #23
Не знаю что случилось с сортировкой
Код:
PHP Fatal error:  Uncaught exception 'Exception' with message 'Error: Unknown column 'd.name' in 'order clause'<br />Error No: 1054<br />SELECT * FROM bro_manufacturer m LEFT JOIN bro_manufacturer_description md ON (m.manufacturer_id = md.manufacturer_id) WHERE md.language_id = '3' ORDER BY d.name ASC LIMIT 0,9999' in /wst.in.ua/system/library/db/mysqli.php:40
Stack trace:
#0 /wst.in.ua/system/library/db.php(45): DB\MySQLi->query('SELECT * FROM b...')
#1 /wst.in.ua/storage/modification/admin/model/catalog/manufacturer.php(145): DB->query('SELECT * FROM b...')
#2 [internal function]: ModelCatalogManufacturer->getManufacturers(Array)
#3 /wst.in.ua/storage/modification/system/engine/loader.php(257): call_user_func_array(Array, Array)
#4 [internal function]: Loader->{closure}(Array, Array)
#5 /wst.in.ua/system/engine/proxy.php(47): call_user_func_array(Object(Closure), Array)
#6/wst.in.ua/system/library/db/mysqli.php on line 40
как я понял ругается на
Код:
$sort_data = array(
            'd.name',
            'm.sort_order'
        );

        if (isset($data['sort']) && in_array($data['sort'], $sort_data)) {
            $sql .= " ORDER BY " . $data['sort'];
        } else {
            $sql .= " ORDER BY d.name";
        }

        if (isset($data['order']) && ($data['order'] == 'DESC')) {
            $sql .= " DESC";
        } else {
            $sql .= " ASC";
        }

        if (isset($data['start']) || isset($data['limit'])) {
            if ($data['start'] < 0) {
                $data['start'] = 0;
            }

            if ($data['limit'] < 1) {
                $data['limit'] = 20;
            }

            $sql .= " LIMIT " . (int)$data['start'] . "," . (int)$data['limit'];
        }

        $query = $this->db->query($sql);
но почему ORDER BY d.name не могу понять. ведь поле в БД называется просто name, пока ничего сам не правил. так как нету уверенности

UPD: не знаю как изменился файл но посмотрев в старый исходник обратил внимание на то что прописано не d.name а md.name, поменяв на md.name. но посмотрев на историю обновления обнаружил что данное изменение появилось при фиксе fix man name err , тогда при тестировании я этот баг не обнаружил.
В общем без вашего вмешательства не разобраться, а то фикс тогда затронул 5 файлов и в некоторых md.name изменен на d.name а в некоторых на m.name
 
Последнее редактирование:
Baco

Baco

architect
#28
Последнее редактирование:
Твой e-mail адрес не будет опубликован. Он нужен для подтверждения сообщения !
Вверх