Notice (8): Undefined offset: 0 [CORE/Baser/Model/Datasource/Database/BcSqlite.phpが発生

いつのタイミングが不明ですが、
下記の表示が大量に発生し、Webサイトの表示が正常にできなくなりました。
Notice (8): Undefined offset: 0 [CORE/Baser/Model/Datasource/Database/BcSqlite.php, line 495]

Notice をクリックして、展開すると下記のメッセージが表示されます。
BcSqlite::resultSet() - CORE/Baser/Model/Datasource/Database/BcSqlite.php, line 495
DboSource::fetchRow() - CORE/Baser/Model/Datasource/DboSource.php, line 687
DboSource::fetchAll() - CORE/Baser/Model/Datasource/DboSource.php, line 733
DboSource::read() - CORE/Baser/Model/Datasource/DboSource.php, line 1239
BcAppModel::find() - CORE/Baser/Model/BcAppModel.php, line 1555
BcSite::findAll() - CORE/Baser/Lib/BcSite.php, line 299
require - CORE/Baser/Config/bootstrap.php, line 307
include - APP/Config/bootstrap.php, line 128
Configure::bootstrap() - CORE/Cake/Core/Configure.php, line 98
include - CORE/Cake/bootstrap.php, line 432
[main] - ROOT/index.php, line 148

さくらインターネットが提供するコントロールパネルでの php.ini の設定は以下のとおりです。
error_reporting = E_ALL & ~E_NOTICE
display_errors = On

Notice の表示を php.ini で抑制しているはずなのに、上記の Notice が表示されます。

BcSqlite.php, line 495 if($metaData[0] === false) { の直前に
$prev_error_reporting = ini_get(‘error_reporting’);
ini_set(‘error_reporting’, 0);
を挿入し、if文のあとに
ini_set(‘error_reporting’, $prev_error_reporting);
を挿入して、error_reporting 設定を元に戻す処理を入れて、対処療法しました。
今のところ、Notice の表示が抑制できているようです。

根本的な解決策を教えていただけますと、助かります。

【環境情報】
・baserCMSのバージョン:4.2.0 および 4.3.7 で確認(上記の報告は 4.3.7の例)
・レンタルサーバー名:さくらインターネットレンタルサーバ、ライトプラン
・データベース:Sqlite

1 Likes

Noticeメッセージは無視していい場合が多いですが、該当部分の処理を見たところ、重要な情報を取得しようとして失敗しているように思えます。ちゃんと修正したほうがよさそうなので、下記の手順を試していただけますですしょうか?

まず、php.iniのini_setでのNotice抑制を元に戻して、またNoticeが表示されるようにしてみてください。

lib/Baser/Model/Datasource/Database\BcSqlite.php
次に上記のファイルをテキストエディタなどで開いて、

if($metaData[0] === false) {

上記の記述を探します。エラー文に BcSqlite.php, line 495 と表示されているので、495行目にあると思います。この部分を、

if(!$metaType) {

上記のように書き換えてみて、Noticeが解決されるかどうかを教えていただけますですしょうか?

ご指示のとおりやってみました。
結論から申しますと、Noticeは発生せず、Webサイトも正常に表示されました。

ご参考までに、実施した手順は以下のとおりです。
(1) さくらインターネットのコントロールパネル php.ini で下記のとおり。
;error_reporting = E_ALL & ~E_NOTICE
;display_errors = On
(2) BcSqlite.php 495行目が下記のようになっていることを確認。
if($metaData[0] === false) {
(3) ホームページをリロードし、Noticeが大量発生することを確認した。

(4) BcSqlite.php 495行目が下記のように変更。
//if($metaData[0] === false) {
if(!$metaType) {
(5) ホームページをリロードし、Noticeが発生せず、表示も正しいことを確認した。

ありがとうございます。参考のため、PHPのバージョンを教えていただけますか?

PHPのバージョンは、7.4.9 (CGI) です。

ありがとうございます。こちらも7.4.9で問題を確認しました。
7.4.5あたりでは問題なかったはずなので、わりと直近のPHPで起きる問題のようです。
以下、主にプログラマー向けの情報共有ですが

<?php
$a['goma'] = 'saba';
$a['tako'] = 'wasa';
echo $a[0];

上記のような書き方が Undefined offset となります。saba が出力されるはずなんですが・・

saba が出力されるはずというのは勘違いでした。ゼロ番目を指定すれば
添字を無視してゼロ番目を取得する、ってことはないので。
ということで、今まで見えなかっただけで、既存の不具合のようです。