Cố gắng truy cập bù mảng trên giá trị của kiểu bool trong PHP 7.4


8

Tôi vừa nâng cấp phiên bản PHP của máy chủ của mình lên PHP 7.4.1 và hiện đang gặp lỗi này:
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;
}

Bản sửa lỗi cho PHP 7.4 là gì?


if($Row['Data'] == false || is_null($Row['Data']))đã sửa nó nhưng tôi tự hỏi nếu đây là sửa chữa đúng.
anjanesh

Phụ thuộc vào những gì MySQL::query()trả về khi không tìm thấy kết quả.
Triby

Nếu không tìm thấy kết quả nào thì nó trả về false, nếu có kết quả thì nó trả về hàng đầu tiên dưới dạng mảng PGS public static function query($sql, $returnRow = FALSE)- tham số thứ 2 là TRUE trong trường hợp này.
anjanesh

2
Vì vậy, bạn nên kiểm tra xem $ Row có sai trước không, chỉ sau đó thử truy cập bất kỳ giá trị nào khác.
Triby

Chỉ cần cảnh giác, Bộ sưu tập từ ít nhất là Laravel 5.4 - 5.8 không tương thích với PHP 7.4 và gặp sự cố với lỗi này.
Henk Poley

Câu trả lời:


8

Dễ dàng với ??toán tử Phpetet

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

Hoặc bạn có thể sử dụng như vậy

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

3
Ái chà! Điều này là mới. Cảm ơn.
anjanesh

Điều này thực sự tuyệt vời ... Tôi chưa bao giờ đi qua nhà điều hành đó! Tôi đã học được rằng có một vài thứ nữa kể từ PHP 7: php.net/manual/en/ Kẻ ...
Gwyneth Llewelyn

0

Nếu truy vấn của bạn không trả về một hàng, thì biến $ Row của bạn sẽ được điền sai, vì vậy bạn có thể kiểm tra xem biến đó có giá trị hay không trước khi thử truy cập bất kỳ chỉ mục nào bên trong nó:

if($Row){
  if(is_null($Row['Data']))
  {
      $session_data = '';
  }...
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.