×

Laravel: Prepared statement needs to be re-prepared

Laravel: Prepared statement needs to be re-prepared

Ohne ersichtlichen Grund (keine Updates oder Änderungen) ging das Projekt verkehrszitate.de vor einigen Tagen regelmäßig in einen Fehlerzustand der mit der Beschreibung „1615 Prepared Statement needs to be re-prepared“ einherging.
Noch während ich mich im Quellcode und in den Logs auf Fehlersuche begeben habe, funktionierte die Seite aber wieder, um etwa 24 Stunden später wieder in diesen Fehler zu fallen. Seltsam!

MySQL als Ursache?

Recherchiert man im Netz, so wird offenbar angeommen, das es sich um einem Fehler von MySQL handeln könnte. In meinem Fall wäre der dann sozusagen von MariaDB adaptiert worden.
Doch eigentlich ist einem als Mensch, der den Fehler beheben will, völlig Wurst, wer Schuld ist, wenn es dafür eine Lösung gibt!

PDO-Option in Laravel disabled

Von Hause aus setzt das Laravel-Framework eine PDO-Option auf false, die bei diesem Fehler die Lösung für das gesamte Problem ist.
Diese kann in der DB-Konfiguration des Frameworks im Options-Array aber einfach eingesetzt werden und der Fehler verschwindet so schnell, wie er gekommen ist:

'options'   => [
        \PDO::ATTR_EMULATE_PREPARES => true
       ]

Editiert wird das in der Datei database.php im Ordner /config des Frameworks.
Der Abschnitt der MySQL-Konfiguration sieht nach der Korrektur dann in etwa wie folgt aus:

'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
            ]) : [],
        ],

Erstaunlich an diesem Fehler ist, das ich fast ein halbes Dutzend Laravel-Projekte betreue, die ohne diesen Parameter fehlerfrei laufen, obwohl das Tooling dasselbe ist und einige davon sogar auf derselben DB laufen.
Welches Quentchen Quellcode gerade bei diesem eher simplen Projekt den Fehlerfall auslöst, bleibt, zumindest mir, vorläufig verborgen, aber die Webseite läuft nun fehlerfrei.

#Pedelec-Fahrer, #BerlinFlamingos, #BerlinAdler, Berlin und Hamburg, WordPress und PHP, Laravel, MariaDB, Soziale Medien sind nicht sozial. #49ers, #FTTB, #3Dprinting, #Alltagsradler, #DataAnalyst