47
votes

SQLSTATE [HY000]: Erreur générale: 1835 Paquet de communication mal formé sur LARAVEL

Soudainement

SQLSTATE [HY000]: Erreur générale: 1835 Paquet de communication tb_users (SQL: sélectionnez * à partir de tb_users où ( username = 121211) limite 1)

sur Laravel.

J'ai déjà vérifié ceci: MySQL: ERROR 2027 (HY000): Paquet mal formé , mais cela semble être un cas différent.

  1. Je me suis connecté avec succès à MySQL après m'être précédemment connecté en utilisant SSH (en utilisant: mysql -u -p).
  2. Je me suis connecté avec succès à MySQL directement depuis un PC distant (en utilisant: mysql -h [IP] -u -p).

Mais mon Laravel a eu l'erreur que j'ai mentionnée auparavant. Une expérience dans ce domaine?


14 commentaires

Mettez à jour votre client et vos bibliothèques, quelque chose semble obsolète? Quelles versions utilisez-vous sur le serveur et le client?


L'application laravel fonctionne déjà depuis plusieurs mois. Pas de mise à jour à la fois sur la version MYSQL ou Laravel.


Si quelque chose fonctionne et que soudainement cela ne fonctionne plus, comment supposez-vous que "rien n'a changé"? Bien sûr, quelque chose a changé dans votre logiciel.


Quelqu'un avec ce problème a-t-il essayé de mettre à niveau les clients vers la même version que le serveur mis à niveau?


Est-ce vraiment MySQL ou MariaDB? Un client a un serveur CPanel et il a mis à jour à la fois le serveur MariaDB et les clients cet AM et c'est là que les problèmes ont commencé.


@CraigJacobs Je pense que MariaDB aussi mais OP ne partage aucune information de version. Quelqu'un peut-il essayer d'ouvrir un problème sur son JIRA, je n'ouvre pas de tickets de bogue en dehors de github.


J'ai également le problème avec MariaDB, version 10.3. Je me suis réveillé ce matin. La solution de contournement ci-dessous transforme les entiers en chaînes dans les réponses. Ce n'est pas une solution.


@matticustard quelles sont vos versions de serveur, de client et de pilote?


@DanielW. Version du serveur: 10.3.26-MariaDB | cpsrvd 11.90.0.16 | Version du client de base de données: libmysql - 5.6.43 ... Désolé si c'est une question stupide, mais où puis-je trouver la version du pilote?


@everyone, il se peut que ce problème soit lié à une mise à jour de MariaDB, voir: mariadb.com/kb/en/mariadb-10326-release-notes


Sur notre serveur: mysql Ver 15.1 Distrib 10.3.26-MariaDB, pour Linux (x86_64) utilisant readline 5.1


Informations supplémentaires: Le passage de PHP 7.2 à PHP 7.3 semble atténuer l'erreur sur mon serveur. Cependant, d'autres problèmes pourraient être introduits avec ce changement.


Pour nous, un domaine utilisant PHP 7.1.33 a le problème, mais notre autre domaine exécutant 7.3.24 ne l'a pas.


Pour confirmer, il s'agit d'un bogue dans toutes les versions suivantes de MariaDB publiées hier: 10.1.48, 10.2.35, 10.3.26, 10.4.16, 10.5.7 Un dossier a été ouvert: jira.mariadb.org/browse/ MDEV-24121 et moi avons fourni un POC reproductible. Ce problème se produit lorsque Emulate Prepares est défini sur false (par défaut dans Laravel) et PDO::ERRMODE_EXCEPTION est défini ensemble. (également par défaut dans Laravel) - La solution de contournement correcte consiste à restaurer et à verrouiller la version précédente jusqu'à ce qu'un correctif soit publié.


14 Réponses :


27
votes

J'ai trouvé la solution. Je ne sais pas si c'est permanent ou temporaire:

'mysql' => [
            'driver' => 'mysql',
            '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' => '',
            'strict' => false,
            'engine' => null,
            **'options'   => [PDO::ATTR_EMULATE_PREPARES => true]**
        ],

sois sûr que

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

existent sur la connexion mysql.


9 commentaires

Cela nous est arrivé aujourd'hui aussi. Autre question SO ici: stackoverflow.com/questions/64677005/… . J'ai essayé votre solution et il semble que l'erreur a disparu! Merci! Bien que d'autres réponses SO prétendent ATTR_EMULATE_PREPARES est livré avec une sécurité réduite ( stackoverflow.com/questions/10113562/… ). Nous verrons...


Nous avons essayé cela pour notre application laravel, mais maintenant rien n'est enregistré dans la base de données.


Ce n'est pas une solution, ni une explication, c'est plutôt une solution de contournement avec des implications non mentionnées dans votre réponse.


Nous l'avons essayé et cela a fonctionné. Mais comme @DanielW. dit que ce n'est qu'une solution de contournement


Cette solution de contournement consiste à changer les entiers en chaînes dans les réponses. Cela provoque l'échec des conditions strictes === en raison de types incompatibles.


Cette solution casse les choses. Je ne le recommande pas. Le problème est qu'il y avait une mise à jour de MariaDB qui a cassé les choses et doit être rétrogradée. Voir le commentaire d'incogzito.


@Raddicus pouvez-vous essayer de mettre à jour le client au lieu de rétrograder le serveur?


Upstream MariaDB JIRA issue MDEV-24121 grâce aux gens de cpanel.


@DanielW. Le déclassement du serveur semblait être la meilleure solution hier. Aujourd'hui, la meilleure solution pourrait être de passer à PHP 7.3. Je n'ai pas suffisamment lu sur la mise à jour du client pour me faire penser que c'est la bonne direction à prendre. Si quelqu'un d'autre essaie, dites-nous comment cela se passe.



8
votes

Également rencontré ce problème après la mise à jour de mariadb pendant la nuit. Le déclassement de mariadb a résolu le problème pour moi.

https://support.cpanel.net/hc/en-us/articles/360056772334


4 commentaires

Ce n'est pas la meilleure solution, car la rétrogradation ramènera quelques problèmes ou améliorations de sécurité qui ont été corrigés lors de la mise à jour :) Mieux vaut mettre à jour votre PHP vers PHP7.3 :-)


Cpanel a mis à jour son article qui n'inclut plus les étapes de rétrogradation, avez-vous les étapes de rétrogradation que vous avez prises?


@JossBird Cela devrait faire le déclassement. yum downgrade MariaDB-server MariaDB-common MariaDB-shared MariaDB-client MariaDB-compat MariaDB-devel . Je recommanderais cependant de tout sauvegarder avant de rétrograder.


Problème différent auquel ALTER TABLE mysql.users DROP COLUMN IF EXISTS password_lifetime, DROP COLUMN IF EXISTS password_last_changed, DROP COLUMN IF EXISTS account_locked; FLUSH PRIVILEGES; corrigera sur MariaDB-10.1, 10.2 et 10.3. 10.4+ n'affichera pas ce problème.



38
votes

Toutes mes applications Laravel exécutant PHP 7.2 avaient cette erreur, mais celles fonctionnant sous PHP 7.3 n'en avaient pas. J'ai donc changé la version PHP en 7.3 et le problème a été résolu. (Exécution de Laravel 7)


2 commentaires

Oui pour les débutants: cPanel -> "Logiciel" -> "Gestionnaire MultiPHP". Sélectionnez "PHP 7.3 dans le menu déroulant de droite. Vérifiez votre (vos) domaine (s) et cliquez pour appliquer. La mise à jour est instantanée


J'ai mis à jour mon php vers la version 7.3 mais j'ai toujours eu le même problème mais mon projet est toujours sur la version 5.4



0
votes

Après de nombreuses solutions de contournement, j'ai essayé aujourd'hui les solutions que j'ai obtenues

1- mise à niveau vers php 7.3 ou 7.4
(de nombreux sites Web seront indisponibles après les mises à niveau de php)

2- Rétrograder vers la version mineure (mariadb 10.4.16 vers 10.4.15)

yum downgrade MariaDB-server MariaDB-common MariaDB-shared MariaDB-client MariaDB-compat MariaDB-devel    

de toute façon, ce problème est ouvert en tant que bogue pour la mise à jour de Mariadb la nuit dernière et ils n'ont poussé aucune correction pour le moment, la solution ci-dessus n'est que les 2 façons de résoudre le problème, cela fonctionne avec moi sur le déclassement de mariadb de 10.4.16 à 10.4.15 ( déclassement mineur)


0 commentaires

18
votes

Ce problème a commencé à se produire pour beaucoup de gens après la récente mise à jour de MariaDB hier après la mise à jour de MariaDB vers la v10.3.26 (et 10.2.35). Ce problème est déjà traité ici: https://jira.mariadb.org/browse/MDEV-24121

Pour l'instant, ce sont les seules solutions connues:

1. Mettez à jour votre PHP vers la version 7.3: Il semble que ces erreurs apparaissent sur les sites utilisant php <7.3. Donc, la mise à niveau de PHP de votre site vers la version 7.3 ou 7.4 devrait résoudre le problème.

INCONVÉNIENTS: Peu d'applications peuvent être facilement mises à niveau vers php 7.3 comme ça. Parfois, vous devrez peut-être mettre à jour votre plate-forme, réécrire certains codes ou vérifier toutes les dépendances et voir si elles fonctionnent toutes sur 7.3. Ce n'est peut-être pas une solution miracle pour de nombreuses applications mûres.

2. Rétrograder MariaDB: Il s'agit d'une correction temporaire car la rétrogradation de MariaDB le remettra à son état précédent.

CONTRE: La rétrogradation de MariaDB n'est pas une chose facile à faire avec un clic sur un bouton de cpanel. Vous aurez peut-être besoin de l'aide d'un ingénieur réseau pour effectuer la rétrogradation à votre place. Après cela, vous devrez peut-être également verrouiller les paquets MariaDB afin d'éviter qu'ils ne soient mis à jour jusqu'à ce qu'ils soient corrigés.

3. Ajoutez 'options' => [PDO::ATTR_EMULATE_PREPARES => true] à la configuration de la base de données: cela a été suggéré dans certaines réponses qui pourraient résoudre 1 problème mais ouvrir de nombreux autres problèmes.

INCONVÉNIENTS: L'ajout de ce qui précède au fichier de configuration de la base de données a résolu 1 problème pour moi, mais cela a également ouvert beaucoup d'autres requêtes qui échouaient, les insertions de base de données échouaient, etc. Je ne recommanderais donc pas du tout ce correctif.

4. Attendez la mise à jour de MariaDB: la prochaine mise à jour devrait résoudre ce problème.

CONTRE: Nous ne savons pas combien de temps il faudra pour obtenir une mise à jour qui résout ce problème pour les anciennes versions de PHP. Cela peut prendre même des jours et certaines applications ne peuvent pas attendre aussi longtemps.

Donc, dans l'ensemble, ce sont les seules options que je peux voir pour le moment. J'espère juste qu'il y aura bientôt un correctif.

Correction à court terme: Surtout, la rétrogradation de MariaDB semble être la seule solution temporaire facile (en quelque sorte) pour moi, étant donné que mon application a besoin de beaucoup de travail pour être prête pour php 7.3. J'ai rétrogradé MariaDB à 10.2.34 et l'ai verrouillé et l'erreur n'apparaît plus.

Correctif à long terme: Il est préférable de préparer éventuellement votre application pour php 7.3 et de la mettre à niveau pour que la nouvelle version de MariaDB ne se plaigne pas non plus.


3 commentaires

MISE À JOUR: J'ai rétrogradé MariaDB à 10.2.34 et l'ai verrouillé et l'erreur n'apparaît plus.


Si vous êtes sur debian 9 avec mariadb 10.2, vous pouvez utiliser sudo apt install mariadb-server-core-10.2=10.2.34+maria~stretch mariadb-server-10.2=10.2.34+maria~stretch mariadb-server=10.2.34+maria~stretch (J'ai dû saisir à nouveau la clé racine lors de la configuration, ne vous inquiétez pas, les données sont toujours là.)


La version d'urgence de MariaDB 10.5.8, 10.4.17, 10.3.27 et 10.2.36 est maintenant disponible et corrige ce problème .



3
votes

Le correctif officiel est enfin disponible et vous pouvez trouver les détails sur le lien:
https://support.cpanel.net/hc/en-us/articles/360056772334/comments/360005577354


Pour le réparer rapidement, connectez-vous simplement via SSH et exécutez

yum versionlock clear
/scripts/upcp

Pour les utilisateurs qui ont appliqué la solution de contournement précédente impliquant la rétrogradation de MariaDB. Assurez-vous de déverrouiller MariaDB pour vous assurer qu'elle continue de recevoir les mises à jour appropriées:

sudo /scripts/autorepair fix_mariadb_show_grants_roles


1 commentaires

Notez que c'était un problème légèrement différent pour l'ancien répertoire de données MySQL-5.7 qui avait été mis à niveau. Il sera corrigé dans la prochaine version, mais il n'était pas suffisamment prêt pour être inclus dans la version d'urgence.



0
votes

Mettez à jour php 7.2 vers php7.4 le meilleur moyen pour moi.

`sudo add-apt-repository ppa: ondrej / php

mise à jour sudo apt

sudo apt installer php7.4-fpm php7.4-commun php7.4-mysql php7.4-xml php7.4-xmlrpc php7.4-curl php7.4-gd php7.4-imagick php7.4-cli php7. 4-dev php7.4-imap php7.4-mbstring php7.4-soap php7.4-zip php7.4-bcmath -y

sudo a2enmod proxy_fcgi setenvif

sudo a2enconf php7.4-fpm

sudo systemctl recharger apache2

sudo systemctl status php7.4-fpm `

Fixé


0 commentaires

1
votes

Je suis sur Ubuntu 20 (focal), notez mon repo, vous devrez le changer selon que vous soyez sur 16 (xenial), 18 (bionic) ou autre

Je n'aime pas la correction des options dans Laravel avec le risque de corrompre les données, et je ne peux pas mettre à niveau PHP vers 7.2+ sans beaucoup de travail, donc pour moi, j'ai rétrogradé une version.

Passer de 10.3.26 -> 10.3.25 sans restaurer toutes les données d'un vidage n'est pas recommandé mais je n'avais pas le choix, et il semble que rien de mal ne se soit produit.

# stop the database

service mariadb stop

# list packages installed

dpkg -l | grep mariadb 

# remove whatever you have or the install will complain about dependencies or broken packages, you need to remove all the mariadb packages

apt remove mariadb-server-core-10.3 
apt remove mariadb-server-10.3
apt remove mariadb-server-10.2
apt remove mariadb-server-10.1

# pin the repo to v10.3.25, remember to remove any conflicting sources you have in /etc/apt/sources.list

apt-get install software-properties-common
apt-key adv --fetch-keys 'https://mariadb.org/mariadb_release_signing_key.asc'
add-apt-repository 'deb [arch=amd64,arm64,ppc64el] http://archive.mariadb.org/mariadb-10.3.25/repo/ubuntu/ focal main'

# install the old version

apt install mariadb-server

# start it back up

service mariadb start


0 commentaires

2
votes

Mise à jour de la version php ** (7.2 à 7.3) ** à l'intérieur de cpanel pour mon sous-domaine.

Doit donner tout le privilège à l'utilisateur de la base de données sélectionné.

Cela a fonctionné pour moi.


0 commentaires

1
votes

Ce qui a fonctionné pour moi était de mettre à niveau la version PHP sur le sous-domaine de 7.2 à 7.3. Je n'ai rien changé dans la configuration de la base de données comme cela a été suggéré dans certaines réponses.


0 commentaires

1
votes

Ce message d'erreur soudain est causé par une mise à jour du client MariaDB, qui semble incompatible avec la version PHP 7.2 de php-mysqlnd ; la version 10.2.35 casse, mais la version 10.2.34 fonctionne toujours. Avec yum ou dnf on peut facilement revenir aux versions précédentes, par exemple. avec:

su
yum history
yum history undo 440

Le paramètre temporaire enabled=0 dans /etc/yum.repo.d/mariadb.repo peut également avoir un sens.
La mise à niveau vers PHP 7.3 pourrait encore être la meilleure option (tant qu'elle est disponible).


0 commentaires

4
votes

Une version d'urgence de MariaDB 10.5.8, 10.4.17, 10.3.27 et 10.2.36 est maintenant disponible et a été publiée pour résoudre spécifiquement cette incompatibilité de protocole dans les anciennes versions de PHP et PDO.


1 commentaires

La plupart de ceux qui trébuchent sur ce point peuvent simplement lancer une mise à jour "yum update" ou "apt-get update"



1
votes

MariaDB vient de publier une mise à jour qui corrige le problème pour ceux qui ne peuvent pas exécuter leur application sur PHP> = 7.3, source: https://mariadb.org/mariadb-10-5-8-10-4-17-10-3- 27-et-10-2-36-maintenant-disponible /


0 commentaires

1
votes

Mariadb a une mise à jour pour php 7.2 qui corrige ce problème, il suffit de mettre à jour le serveur:

sudo apt update
sudo apt upgrade


0 commentaires