Trying to access array offset on value of type null как исправить

Сегодня запустил на своем пк один проект, который был создан 7.1 версии php. У меня стоит 7.4 и выдаёт напоминалку на экране:

Notice: Trying to access array offset on value of type null
Ссылкой на эту строку в коде:

if(file_exists(‘../app/controllers/’ . ucwords($url[0]). ‘.php’))

Как изменить код, да бы убрать эту ошибку
Вот код целиком из файла:

   <?php

      class Core {
        protected $currentController = 'Pages';
        protected $currentMethod = 'index';
        protected $params = [];

        public function __construct(){

          $url = $this->getUrl();


if(file_exists('../app/controllers/' . ucwords($url[0]). '.php')){
            $this->currentController = ucwords($url[0]);
            unset($url[0]);

          }

          require_once '../app/controllers/'. $this->currentController . '.php';

          $this->currentController = new $this->currentController;

          if(isset($url[1])){
            if(method_exists($this->currentController, $url[1])){
              $this->currentMethod = $url[1];
              unset($url[1]);
            }
          }

          $this->params = $url ? array_values($url) : [];

          call_user_func_array([$this->currentController, $this->currentMethod], $this->params);
        }

        public function getUrl(){
          if(isset($_GET['url'])){
            $url = rtrim($_GET['url'], '/');
            $url = filter_var($url, FILTER_SANITIZE_URL);
            $url = explode('/', $url);
            return $url;
          }
        }
      } 

У меня есть форма авторизации, где получают пароль по введеному $_POST[‘telegram_id’],
если пароль равен введенному $_POST[‘password’] то все ок.
Но если ввести telegram_id которого нет в ДБ, выходит ошибка Trying to access array offset on value of type null
Как исправить?
Код:

<?php
session_start();
require_once '../admin/connection.php';
include '../admin/tg_token.php';
//текста ошибки по стандарту нет
$id_error = '';
$pass_error = '';
if (isset($_POST['auth'])) {

$telegram_id = filter_var(trim($_POST['telegram_id']), FILTER_SANITIZE_STRING);
$password = filter_var(trim($_POST['password']), FILTER_SANITIZE_STRING);

//проверка длины
if(strlen($telegram_id) < 5 || strlen($telegram_id) > 15 ) {
	$id_error = "Недопустимая длина ID";
}

if(strlen($password) < 5 || strlen($password) > 20 ) {
	$pass_error = "Недопустимая длина пароля";
}

	$query = "SELECT * FROM `workers` WHERE telegram_id='$telegram_id'";
  $result = $mysql->query($query);
  $result = $result->fetch_assoc();
if ($telegram_id == $result["telegram_id"] and $password == $result["password"])   {
echo "пароль верный";
}
else {
	echo "пароль неверный";
}
}
?>


  • Вопрос задан

    более двух лет назад

  • 9289 просмотров

Пригласить эксперта

fetch_assoc вместо массива возвращает null, если запрос вернул пустой результат. У вас переменная $result равна null. Об этом прямо написано в ошибке.

if (
    is_array($result)
    && $telegram_id === $result["telegram_id"]
    && $password === $result["password"]
) {
    echo "пароль верный";
}

Кстати, советую эту статью почитать: https://habr.com/ru/post/148701/. К слову, рано или поздно вы с автором этой статьи тут столкнётесь (если он не забанен сейчас), потому что он мимо такого кода не проходит, и у него большая практика тыкания лицом в какашки.


  • Показать ещё
    Загружается…

23 мая 2023, в 09:37

1000 руб./за проект

23 мая 2023, в 09:24

4000 руб./за проект

23 мая 2023, в 08:39

20000 руб./за проект

Минуточку внимания

In this ultimate guide, we’ll dive deep into the error “Trying to Access Array Offset on Value of Type Null” in PHP, understand its root cause, and provide a step-by-step solution to fix it. This comprehensive guide is designed to help developers understand and resolve this common PHP error.

Table of Contents

  1. Introduction to the Error
  2. Root Cause of the Error
  3. Step-by-Step Solution
  4. FAQ Section
  5. Related Links

Introduction to the Error

The “Trying to Access Array Offset on Value of Type Null” error occurs when you’re trying to access an array offset on a variable that is null. This error was introduced in PHP 7.4, as part of a more strict type checking system to help identify possible issues in code.

This error often occurs when:

  1. You’re trying to access an array element that doesn’t exist.
  2. The variable you’re trying to access is not an array but a null value.

Here’s an example of the error:

$nullVar = null;
echo $nullVar[0]; // Trying to access array offset on value of type null

Root Cause of the Error

The root cause of this error lies in the fact that PHP is a loosely typed language. Historically, PHP hasn’t been strict about data types, which means it would often allow accessing array elements on non-array variables without throwing an error. However, this behavior has changed in PHP 7.4, and this error is now thrown to help developers identify potential issues in their code.

Step-by-Step Solution

To fix the “Trying to Access Array Offset on Value of Type Null” error, follow these steps:

  1. Identify the variable causing the error.
  2. Check if the variable is an array before accessing its elements.
  3. Ensure that the array element you’re trying to access exists.

Step 1: Identify the variable causing the error

The first step in fixing the error is identifying the variable causing the error. Look at the error message and find the line number where the error occurs. This will help you identify the problematic variable.

Step 2: Check if the variable is an array before accessing its elements

Before accessing the array elements, ensure that the variable is an array. You can use the is_array() function to check if a variable is an array:

$var = null;

if (is_array($var)) {
    echo $var[0]; // Access array element only if $var is an array
} else {
    echo "Variable is not an array.";
}

Step 3: Ensure that the array element you’re trying to access exists

To avoid the error, check if the array element you’re trying to access exists by using the isset() function:

$arrayVar = ['a', 'b', 'c'];

if (isset($arrayVar[0])) {
    echo $arrayVar[0]; // Access array element only if it exists
} else {
    echo "Array element does not exist.";
}

By following these steps, you can fix the “Trying to Access Array Offset on Value of Type Null” error in PHP.

FAQ Section

Q1: What is the difference between the isset() and array_key_exists() functions in PHP?

Both functions are used to check if an array element exists. However, isset() checks if a variable is set and not null, whereas array_key_exists() checks if the given key is present in the array, regardless of its value being null or not.

$array = ['key' => null];

var_dump(isset($array['key'])); // bool(false)
var_dump(array_key_exists('key', $array)); // bool(true)

Q2: Can I suppress the error using the error suppression operator @?

Yes, you can use the error suppression operator @ to suppress the error, but it’s not recommended. Suppressing the error does not fix the issue; it only hides the error message. It’s better to fix the issue following the step-by-step solution provided in this guide.

Q3: Is it possible to disable strict type checking in PHP 7.4?

No, it’s not possible to disable strict type checking in PHP 7.4. The introduction of strict type checking is aimed at helping developers identify potential issues in their code. Disabling it would defeat its purpose.

Q4: How can I check if a variable is an array or an object implementing the ArrayAccess interface?

You can use the instanceof operator to check if a variable is an object implementing the ArrayAccess interface:

$var = new ArrayObject();

if (is_array($var) || $var instanceof ArrayAccess) {
    echo "Variable is either an array or an object implementing ArrayAccess.";
} else {
    echo "Variable is not an array or an object implementing ArrayAccess.";
}

Q5: How can I convert a null variable to an empty array?

You can use the array() function or the short array syntax [] to convert a null variable to an empty array:

$nullVar = null;

$nullVar = array(); // Convert null variable to an empty array
// or
$nullVar = []; // Convert null variable to an empty array using short array syntax
  1. PHP Manual: is_array() function
  2. PHP Manual: isset() function
  3. PHP Manual: array_key_exists() function
  4. PHP Manual: ArrayAccess interface
  5. Stack Overflow: “Trying to Access Array Offset on Value of Type Null” Error

@houseme

  • Laravel Version: 5.7.7
  • PHP Version: 7.4.0
  • Database Driver & Version:

Description:

Trying to access array offset on value of type null

Steps To Reproduce:

Perform any access or execute the ‘php artisan’ command

@GrahamCampbell

We’ll need more information than this. Is this a fresh Laravel app. What’s the stack trace?

@driesvints

@houseme

Please provide some code

The current situation is due to access to the default home page after the PHP version has been upgraded to version 7.4.

@zecipriano

Having the same issue. I have a model with a jsonb field that is casted to an array, like this.

protected $casts = [
     'data' => 'array',
];

In PHP 7.3, when I dump the model, ‘data’ is an array (as expected). In PHP 7.4, ‘data’ is null.

Edit: Didn’t notice the Laravel version on first post. I’m on Laravel 6.5.1

@mfn

Laravel Version: 5.7.7

It Laravel 5.7 supposed to work with PHP 7.4?

@driesvints

I didn’t catch the version here. 5.7 indeed doesn’t supports PHP 7.4 and isn’t maintained anymore.

Please check out our support policy on which versions we are currently supporting.

@zecipriano

@driesvints The issue is present on 6.5.1

Edit: Please disregard this. I’m not being able to reproduce the issue on a fresh install on Laravel. The issue might be somewhere else.

@3alampro

I’m having the same issue when using laravel 6 with php 7.4

Step to reproduce

in your controller create new instance of any model and pass it to view something like

$banner = new Banner();

return view('back.banners.create', compact('banner'));

and in your view try to use old helper something like

old('title.en', $banner->title['en'])

Workaround to use the optional helper to ignore the error produced by php 7.4

old('title.ar', optional($banner->title)['en'])

in php 7.3 this was not an issue and the code worked fine I think the old helper need adjustment for php 7.4 to work like the old behaviour

@Chrissi2812

According to PHP-Doc this is a Backwards Incompatible Change

Array-style access of non-arrays

Trying to use values of type null, bool, int, float or resource as an array (such as $null[“key”]) will now generate a notice.

@sun4sun

some note
… /vendor/illuminate/support/ServiceProvider.php

95:    protected function loadViewsFrom($path, $namespace)
96:    {
97:    --    if (is_array($this->app->config['view']['paths'])) {
97:   ++    if (isset($this->app->config['view']) && is_array($this->app->config['view']['paths'])) {

@MuhammadTaha

Had following configurations:

  • laravel/lumen-framework 5.7
  • php 7.4.2

downgrading to php 7.2 worked for me

@Yigaue

Maybe in some case you try composer update first.

@ryancwalsh

I didn’t catch the version here. 5.7 indeed doesn’t supports PHP 7.4 and isn’t maintained anymore.

Please check out our support policy on which versions we are currently supporting.

I was having this same “Trying to access array offset on value of type null.” problem, and it referenced /vendor/egulias/email-validator/EmailValidator/Parser/Parser.php(147): IlluminateFoundationBootstrapHandleExceptions->handleError().

This start happening for me after I upgraded my server to PHP 7.4.

And it was for a Laravel 5.8 (not 5.7) app. Upgrading to Laravel 6.x seemed to fix it.

@agharium

this issue happened for me on laravel 5.8 on php 7.4. Downgrading the php to 7.3 fixed it.

@driesvints

@agharium

@jafarabbas110

same issue
Trying to access array offset on value of type null in F:xampphtdocsmlmprojectadminjoin.php on line 116

@driesvints

@laravel
laravel

locked and limited conversation to collaborators

Feb 18, 2020

Миграция с PHP5 на PHP7 и PHP8: что чаще всего приходится править в исходниках

Если не считать необходимого теперь перехода с MySQL на MySQLi и борьбы с Warning: A non-numeric value encountered, есть ещё несколько типовых проблем при миграции скриптов с PHP 5.X (особенно если исходная версия ниже 5.3) на PHP 7.3 – 7.4, а позднее и на PHP 8. Попробую приспособить для описания решений эту заметку, если ещё всплывёт подобное.

Для проверки фрагментов кода предполагалось, что в его начале указана директива

 error_reporting (E_ALL);
Уведомление Trying to access array offset on value of type null/bool/int

Часто возникает при использовании синтаксиса обращения к элементу массива на других типах данных. Пример:

$a = false;
var_dump($a['somekey']);
// PHP 7.3: 
// NULL
// 
// PHP 7.4:
// Notice: Trying to access array offset on value of type bool in Command line code on line ...

Так бывает, например, если функция может возвращать массив в нормальном случае и false/null в случае ошибки, а дальше вверх по стеку информация о false/null теряется и этот случай не обрабатывается отдельно.

Решение – проверять с помощью is_array, является ли объект массивом.

Применение функции mysql_real_escape_string

…которой традиционно “обезопасивали” хранимые в базе данных строки от SQL-инъекций.

было: mysql_real_escape_string($s)

надо: mysqli_real_escape_string ($id,$s), где $id – идентификатор соединения MySQLi. Или хотя бы addslashes($s) – если нужно только экранировать “опасные” для SQL-запроса кавычки.

Перебор массива с помощью list и each

было: while (list(,$var) = each($params)) {

надо: foreach ($params as $var) {

или же: while (list($num,$var) = each($params)) {

а теперь: foreach ($params as $num=>$var) {

– если массив перебирается как ассоциативный и/или нужны ключи его элементов.

Модификатор /e функции preg_replace

было:

$text = preg_replace('~([0-9]+)^([0-9]+)~e', 'pow("\1", "\2")', $text); //вычислить a^b

надо:

$text = preg_replace_callback('~([0-9]+)^([0-9]+)~',

function ($m) { return pow($m[1], $m[2]); }, $text); //вычислить a^b

– то есть, через callback-функцию.

Проблема с подключаемыми графическими шрифтами GD

было:

$bbox=imagettfbbox ($f,0,'arial.ttf','String');

надо:

$font = dirname(__FILE__) . '/arial.ttf';

$bbox=imagettfbbox ($f,0,$font,'String');

– если фонт лежит в папке скрипта, как обычно и бывает.

То же самое с imageTtfText, например:

$font = dirname(__FILE__) . '/Roboto-Bold.ttf';
imageTtfText($myimg, $size, $angle, $j, 30, $c, $font, $z);
error_reporting(0) и подобное

Многие разработчики привыкли решать проблему с предупреждениями и даже сообщениями об ошибках просто выключая сообщения о них. При миграции скриптов это приводит к “загадочным белым экранам” вместо содержимого. Лучше всего вообще не трогать включённое в новых версиях протоколирование ошибок по умолчанию, а все вызовы функции error_reporting приводить к виду, указанному в начале статьи.

Строковые функции

Начиная с версии PHP 5.6 кодировкой по умолчанию стала кодировка Юникода UTF-8, соответственно, вместо прежних “си-подобных” строковых функций теперь лучше использовать их многобайтовые аналоги.

Наиболее часто приходится менять:

  • вместо strlen($s) писать mb_strlen($s,'UTF-8');
  • вместо strpos ($haystack,$needle,0) писать mb_strpos ($haystack,$needle,0,'UTF-8');
  • вместо strstr ($haystack,$needle,false) писать mb_strstr ($haystack,$needle,false,'UTF-8');
  • вместо substr ($string,$start,$length) писать mb_substr ($string,$start,$length,'UTF-8')

…и т.д., принцип, думаю, понятен. Будьте внимательны, проверяя, есть ли для функции многобайтовый аналог.

Для “бинарно безопасных” функций strcmp / strcasecmp, к примеру, таковых нет, а сравнение всё равно не работает:

<?php
 $s1="Привет";
 $s2="привет";
 echo strcasecmp($s1,$s2); //-32
?>

и нужно делать так:

<?php
 function mb_strcasecmp($str1, $str2, $encoding = null) {
  if (null === $encoding) { $encoding = mb_internal_encoding(); }
  return strcmp(mb_strtoupper($str1, $encoding), mb_strtoupper($str2, $encoding));
 }

 $s1="Привет";
 $s2="привет";
 echo mb_strcasecmp($s1,$s2,'UTF-8'); //0
?>

С другой стороны, как видно из примера, для strtoupper и strtolower эти аналоги есть.

Применение array_key_exists к объекту, а не к массиву

Теперь нельзя применять array_key_exists к объектам классов (а можно только к массивам). Неправильно:

 class foo {
  public $a, $b;
 };
 $bar = new foo();
 echo (array_key_exists('a',$bar) ? 'yes' : 'no'); //deprecated

Правильно:

  echo (property_exists($bar,'a') ? 'yes' : 'no'); //yes

Итак, 8-я версия, вышедшая в ноябре-2020, теперь есть и в составе XAMPP, ниже, вероятнее всего, будут добавляться исправления для PHP8, хотя и для версии 7 всё написанное выше остаётся в силе.

Отмечу, что в сборке PHP 8.0.0 с сайта XAMPP в файле php.ini ( диск:xamppphpphp.ini ) была по умолчанию отключена библиотека gd:

;extension=gd

Соответственно, все функции imagecreatetruecolor,
imagecreatefromgif,
imagecreatefromjpeg,
imagecreatefrompng и т.д. “вдруг перестали работать”.

Решение – убрать точку с запятой из первой позиции указанной выше строки,
сохранить изменённый php.ini, перезагрузиться.

Функция get_magic_quotes_gpc удалена (PHP8)

Любые упоминания о функции get_magic_quotes_gpc теперь придётся исключить из кода, она просто удалена. При этом нужно учесть, что начиная с версии 5.4 она всё равно всегда возвращала 0.

Почему нельзя было оставить в реализации пустое имя функции, а надо заставлять людей переделывать кучу кода – совершенно неясно.

И так у них всё 🙁

Функция each удалена (PHP8)

Удалена в PHP8 и функция each. В общем случае можно попытаться заменить на next
или array_shift, но однозначного рецепта нет из-за возможности использования функции не только в цикле, как показано выше, но и, например, в рекурсивных построениях.

Фигурные скобки и литералы без кавычек для индексов массива (PHP8)

В PHP8 больше нельзя писать $a{$i} вместо $a[$i] или $foo[bar] вместо $foo['bar']. Просто исправьте это.

Разумеется, если ключ является числовой константой или берётся из переменной, заключать его в апострофы не нужно, $i = 1; $a[$i] или $a[1] – это верный синтаксис.

13.02.2020, 17:35 [17550 просмотров]


Добавить комментарий