Intentando acceder a la compensación de matriz en el valor de tipo bool en PHP 7.4


8

Acabo de actualizar la versión de PHP de mi servidor a PHP 7.4.1 y ahora obtengo este 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;
}

¿Cuál es la solución para PHP 7.4?


if($Row['Data'] == false || is_null($Row['Data']))lo solucioné, pero me pregunto si esta es la solución correcta.
— anjanesh

Depende de lo que MySQL::query()regrese cuando no se encontraron resultados.
— Triby

Si no se encuentran resultados, devuelve falso, si hay un resultado, devuelve la primera fila como una matriz de asociación, public static function query($sql, $returnRow = FALSE)el segundo parámetro es VERDADERO en este caso.
— anjanesh

2
Por lo tanto, primero debe verificar si $ Row es falso, solo luego intente acceder a cualquier otro valor.
— Triby

Solo un aviso, la Colección de al menos Laravel 5.4 - 5.8 es incompatible con PHP 7.4, y se bloquea con este error.
— Henk Poley

Respuestas:


8

Fácil con el ??operador isset Php

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

O puedes usar como tal

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


3
Woah! Esto es nuevo. Gracias.
— anjanesh

Esto es realmente sorprendente ... ¡Nunca me había encontrado con ese operador! He aprendido que hay algunos más desde PHP 7: php.net/manual/en/… ...
— Gwyneth Llewelyn

0

Si su consulta no devuelve una fila, entonces su variable $ Row se completará con falso, por lo que puede probar si la variable tiene un valor antes de intentar acceder a cualquier índice dentro de ella:

if($Row){
  if(is_null($Row['Data']))
  {
      $session_data = '';
  }...
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.