PHP 7.4でbool型の値の配列オフセットにアクセスしようとしています


8

サーバーのPHPバージョンをPHP 7.4.1にアップグレードしたところ、次のエラーが発生しました。
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;
}

PHP 7.4の修正は何ですか?


if($Row['Data'] == false || is_null($Row['Data']))それを修正しましたが、これが正しい修正かどうか疑問に思っています。
anjanesh

MySQL::query()結果が見つからなかったときに何を返すかによって異なります。
トライビー

結果が見つからない場合はfalseを返し、結果がある場合は最初の行を連想配列として返しますpublic static function query($sql, $returnRow = FALSE)。この場合、2番目のパラメーターはTRUEです。
anjanesh

2
したがって、最初に$ Rowがfalseかどうかを確認してから、他の値にアクセスしてみてください。
トライビー

正解ですが、少なくともLaravel 5.4-5.8のコレクションはPHP 7.4と互換性がなく、このエラーでクラッシュします。
Henk Poley

回答:


8

Php ??issetオペレーターで簡単に

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

またはあなたはそのように使うことができます

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

3
うわー!これは、新しい。ありがとう。
anjanesh

これは本当に素晴らしいです...私はそのオペレーターに出会ったことがありませんでした!PHP 7以降、さらにいくつかあることを学びました:php.net/manual/en/… ...
Gwyneth Llewelyn

0

クエリが行を返さない場合、変数$ Rowはfalseで埋められるため、変数内のインデックスにアクセスする前に、変数に値があるかどうかをテストできます。

if($Row){
  if(is_null($Row['Data']))
  {
      $session_data = '';
  }...
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.