PHPフレームワーク「Laravel」において、データベース「MariaDB(MySQL)」にて発生したエラーについてです。
General error: 1615 prepared statement needs to be re-prepared
こちらのエラーは、コントローラーからデータベースにアクセスした際に発生しました。
開発環境(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,
]) : [],
],