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

I just upgraded my server's PHP version to PHP 7.4.1 and now getting this error: Notice: Trying to access array offset on value of type bool in public static function read($id) { $Row = MySQL::

I just upgraded my server’s PHP version to PHP 7.4.1 and now getting this error:

Notice: Trying to access array offset on value of type bool in

public static function read($id)
{
    $Row = MySQL::query("SELECT `Data` FROM `cb_sessions` WHERE `SessionID` = '$id'", TRUE);
    
    # http://php.net/manual/en/function.session-start.php#120589
    //check to see if $session_data is null before returning (CRITICAL)
    if(is_null($Row['Data']))
    {
        $session_data = '';
    }
    else
    {
        $session_data = $Row['Data'];
    }
    
    return $session_data;
}

What is the fix for PHP 7.4 ?

Dharman's user avatar

Dharman

29.3k21 gold badges80 silver badges131 bronze badges

asked Jan 10, 2020 at 2:48

anjanesh's user avatar

7

Easy with PHP ?? null coalescing operator

return $Row['Data'] ?? 'default value';

Or you can use as such

$Row['Data'] ??= 'default value';
return $Row['Data'];

Dharman's user avatar

Dharman

29.3k21 gold badges80 silver badges131 bronze badges

answered Jan 10, 2020 at 19:19

dılo sürücü's user avatar

dılo sürücüdılo sürücü

3,5011 gold badge23 silver badges28 bronze badges

2

If your query does not return a row, then your variable $Row will be filled with false,
so you can test if the variable has a value before try to access any index inside it:

if($Row){
  if(is_null($Row['Data']))
  {
      $session_data = '';
  }...

answered Jan 10, 2020 at 18:45

raul dev br's user avatar

Today We are Going To Solve Notice: Trying to access array offset on value of type bool in Php. Here we will Discuss All Possible Solutions and How this error Occurs So let’s get started with this Article.

Contents

  • 1 How to Fix Notice: Trying to access array offset on value of type bool Error?
    • 1.1 Solution 1 : Use the command
    • 1.2 Solution 2 : Use the if else condition
  • 2 Conclusion
    • 2.1 Also Read These Solutions
  1. How to Fix Notice: Trying to access array offset on value of type bool Error?

    To Fix Notice: Trying to access array offset on value of type bool Error just Use the command. You can use the below command to solve this error. I hope this will help you. return $Row['Data'] ?? 'default value';

  2. Notice: Trying to access array offset on value of type bool

    To Fix Notice: Trying to access array offset on value of type bool Error just Use the if else condition. Just use the if-else condition to solve this issue. Try it.
    if($mydata){ if(is_null($mydata['Data'])) { $session_data = ''; }...

Solution 1 : Use the command

You can use the below command to solve this error. I hope this will help you.

return $Row['Data'] ?? 'default value';

Solution 2 : Use the if else condition

Just use the if-else condition to solve this issue. Try it.

if($mydata){
  if(is_null($mydata['Data']))
  {
      $session_data = '';
  }...

Conclusion

So these were all possible solutions to this error. I hope your error has been solved by this article. In the comments, tell us which solution worked? If you liked our article, please share it on your social media and comment on your suggestions. Thank you.

Also Read These Solutions

  • xlrd.biffh.XLRDError: Excel xlsx file; not supported in python
  • ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all()
  • Error: Cannot find module ‘node:events’
  • Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.1:compile (default-compile) on project Maven: Compilation failure: Compilation failure
  • ImportError: DLL load failed while importing _multiarray_umath: The specified module could not be found

Миграция с 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 [15091 просмотр]


К этой статье пока нет комментариев, Ваш будет первым

I am trying to test magento 2.4 with PHP7.4.

I have a custom module with this code:

//checking for absolute weight
$res = $this->_objectManager->get('MagentoFrameworkAppResourceConnection');
$con = $res->getConnection('read');
$row = $con->fetchRow("select `absolute_weight`, `absolute_sku`, `sku_order` from {$res->getTableName('dynamicproductoptions_options')} where `product_id`={$product->getId()} and (`store_id`={$product->getStoreId()} or `store_id`=0) order by `store_id` desc");
$isAbsoluteWeight = (int) $row['absolute_weight'];
$isAbsoluteSku = (int) $row['absolute_sku'];

But this line:

$isAbsoluteWeight = (int) $row['absolute_weight'];

return error when I try to add a product in cart:

Notice: Trying to access array offset on value of type bool in my
file.php

How can I fix it the right way please?

asked Sep 3, 2020 at 17:50

G. G.'s user avatar

Notice: Trying to access array offset on value of type bool in my file.php

This means $row is false, your query returned no results. You need to at least add in if statements for the case where the query returns no results. More accurately you need to check if these array offsets exist when using them.
An Example based on your code:

//checking for absolute weight
$res = $this->_objectManager->get('MagentoFrameworkAppResourceConnection');
$con = $res->getConnection('read');
$row = $con->fetchRow("select `absolute_weight`, `absolute_sku`, `sku_order` from {$res->getTableName('dynamicproductoptions_options')} where `product_id`={$product->getId()} and (`store_id`={$product->getStoreId()} or `store_id`=0) order by `store_id` desc");
$isAbsoluteWeight = null;
$isAbsoluteSku = null;
if (!empty($row)) {
    $isAbsoluteWeight = !empty($row['absolute_weight']) ? (int) $row['absolute_weight'] : false;
    $isAbsoluteSku = !empty($row['absolute_sku']) ? (int) $row['absolute_sku'] : false;
}

Then what you attempt to process those values you need to add the conditionals necessary to prevent the errors.

if ($isAbsoluteWeight && $isAbsoluteSku) {
    //Do stuff
}

answered Sep 3, 2020 at 18:40

Mark Rees's user avatar

Mark ReesMark Rees

3561 silver badge6 bronze badges

2

Понравилась статья? Поделить с друзьями:
  • Truckers mp error cannot create game process
  • Try remap error превышен таймаут семафора
  • Truckers mp an error occurred while contacting our update servers
  • Try remap error не удается найти указанный файл
  • Truck error codes скачать на айфон