【Laravel備忘録】MariaDBエラー「General error: 1615 prepared statement needs to be re-prepared」

PHPフレームワーク「Laravel」において、データベース「MariaDB(MySQL)」にて発生したエラーについてです。

Laravel エラー

General error: 1615 prepared statement needs to be re-prepared

★環境
 ベースOS:Linux(CentOS7)
 PHP:7.4
 PHPフレームワーク:Laravel 8.x
 MariaDB:10.x

こちらのエラーは、コントローラーからデータベースにアクセスした際に発生しました。

開発環境(Laradock)では発生せず、本版環境にアップでのみ発生。

今回、データベースのアクセス先に初めて「view」を参照しており、似たような記事を発見したので、「view」でなく直接テーブルを参照するも改善せず。

目次

【解決】「table_definition_cache 」の値を変更

調べるとMariaDBの「table_definition_cache」の設定値が怪しい可能性があり、設定を変更しました。

table_definition_cacheを「400」->「1024」に変更

[mysqld]
table_definition_cache = 1024

SQLで 「table_definition_cache 」を確認する方法
show variables like ‘table_definition_cache’

サービスを再起動したらエラーが発生せず、正しく実行されました。

【その他解決案】Laravelの「config/database.php」を変更

私は変更しませんでしたが、今回のエラーは、多くの場合、 Laravelの「config/database.php」 の値を変更する事で解決するケースもあるようです。

「mysql」の「options」に「PDO::ATTR_EMULATE_PREPARES => true,」を追記する

        'mysql' => [
            'driver' => 'mysql',
            'url' => env('DATABASE_URL'),
            'host' => env('DB_HOST', '127.0.0.1'),
            'port' => env('DB_PORT', '3306'),
            'database' => env('DB_DATABASE', 'forge'),
            'username' => env('DB_USERNAME', 'forge'),
            'password' => env('DB_PASSWORD', ''),
            'unix_socket' => env('DB_SOCKET', ''),
            'charset' => 'utf8mb4',
            'collation' => 'utf8mb4_unicode_ci',
            'prefix' => '',
            'prefix_indexes' => true,
            'strict' => true,
            'engine' => null,
            'options' => extension_loaded('pdo_mysql') ? array_filter([
                PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
                PDO::ATTR_EMULATE_PREPARES => true,
            ]) : [],
        ],
よかったらシェアしてね!
目次
閉じる