49

突然得到

SQLSTATE[HY000]: 一般错误: 1835 Malformed communication packet (SQL: select * from tb_userswhere ( username= 121211) limit 1)

在 Laravel 上。

我已经检查过这个:MySQL: ERROR 2027 (HY000): Malformed packet,但它似乎是不同的情况。

  1. 之前使用 SSH 登录(使用:mysql -u -p)后,我已成功登录 MySQL。
  2. 我已经成功地直接从远程 PC 登录到 MySQL(使用:mysql -h [IP] -u -p)。

但是我的 Laravel 得到了我之前提到的错误。有这方面的经验吗?

4

16 回答 16

39

我所有运行 PHP 7.2 的 Laravel 应用程序都有这个错误,但运行在 PHP 7.3 上的应用程序没有。于是我把PHP版本改成了7.3,问题就解决了。(运行 Laravel 7)

于 2020-11-05T01:36:23.093 回答
28

找到了解决方案。不知道是永久的还是临时的:

'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]**
        ],

确保

'选项' => [PDO::ATTR_EMULATE_PREPARES => true]

存在于mysql连接上。

于 2020-11-04T10:28:26.270 回答
18

在昨天将 MariaDB 更新到 v10.3.26(和 10.2.35)之后,最近的 MariaDB 更新后,这个问题开始发生在很多人身上。此问题已在此处解决:https ://jira.mariadb.org/browse/MDEV-24121

到目前为止,这些是唯一已知的解决方案:

1. 将您的 PHP 升级到 7.3:这些错误似乎显示在使用 php < 7.3 的网站上。因此,将您网站的 PHP 升级到 7.3 或 7.4 版应该可以解决问题。

缺点:不是很多应用程序都可以像这样轻松升级到 php 7.3。有时您可能需要更新您的平台,重写一些代码或检查所有依赖项,看看它们是否都适用于 7.3。对于许多成熟的应用程序来说,这可能不是一个快速解决方案。

2. 降级 MariaDB:这是一个临时修复,因为降级 MariaDB 会将其设置回之前的状态。

缺点:通过单击 cpanel 中的按钮来降级 MariaDB 并不是一件容易的事。您可能需要网络工程师的帮助才能为您进行降级。之后,您可能还需要对 MariaDB 软件包进行 yum 锁定,以避免在修补它们之前对其进行更新。

3. 添加'options' => [PDO::ATTR_EMULATE_PREPARES => true]到数据库配置:这已在一些答案中提出,这可能会解决 1 个问题,但会引发许多其他问题。

缺点:将上述内容添加到数据库配置文件为我解决了 1 个问题,但它也打开了很多其他失败的查询、失败的数据库插入等。所以我根本不推荐这个修复。

4. 等待 MariaDB 更新:下一次更新应该会解决这个问题。

缺点:我们不知道需要多长时间才能获得修复旧版本 PHP 的此问题的更新。甚至可能是几天,一些应用程序可能无法等待那么久。

总而言之,这些是我目前能看到的唯一选择。只是希望很快有一个修复它。

短期修复:总之,考虑到我的应用程序需要大量工作才能为 php 7.3 做好准备,降级 MariaDB 似乎是我唯一简单(排序)的临时修复。我将 MariaDB 降级到 10.2.34 并锁定它,错误不再出现。

长期修复:最好最终让您的应用程序为 php 7.3 做好准备并升级到该版本,这样 MariaDB 较新版本也不会抱怨。

于 2020-11-05T17:46:37.507 回答
8

mariadb 一夜更新后也遇到了这个问题。降级 mariadb 为我解决了这个问题。

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

于 2020-11-04T17:19:54.953 回答
4

MariaDB 10.5.8、10.4.17、10.3.27 和 10.2.36的紧急版本现已发布,专门用于解决旧 PHP 版本和 PDO 中的此协议不兼容问题。

于 2020-11-11T21:52:39.383 回答
3

官方修复已完成,您可以在链接中找到详细信息:https:
//support.cpanel.net/hc/en-us/articles/360056772334/comments/360005577354


要快速修复它,只需通过 SSH 连接并运行

sudo /scripts/autorepair fix_mariadb_show_grants_roles

对于已应用之前涉及降级 MariaDB 的解决方法的用户。请务必解锁 MariaDB 以确保它继续接收适当的更新:

yum versionlock clear
/scripts/upcp
于 2020-11-06T18:07:19.800 回答
2

在我的子域的 cpanel 中更新了 php 版本**(7.2 到 7.3)**。

必须将所有特权授予选定的数据库用户。

它对我有用。

于 2020-11-09T01:10:52.027 回答
1

Mariadb 有一个 php 7.2 的更新来解决这个问题,只需更新服务器:

sudo apt update
sudo apt upgrade
于 2020-11-17T10:52:14.047 回答
1

对我有用的是将子域上的 PHP 版本从 7.2 升级到 7.3。正如某些答案中所建议的那样,我没有更改数据库配置中的任何内容。

于 2020-11-09T09:12:13.113 回答
1

MariaDB 刚刚发布了一个升级,解决了那些无法在 PHP >= 7.3 上运行应用程序的问题,来源:https ://mariadb.org/mariadb-10-5-8-10-4-17-10-3- 27-和-10-2-36-现在可用/

于 2020-11-12T02:29:04.027 回答
1

我在 Ubuntu 20(焦点)上,请注意我的存储库,您需要根据您的 16(xenial)、18(仿生)或其他方式更改它

我不喜欢 Laravel 中的选项修复,因为它可能会损坏数据,而且我无法在没有大量工作的情况下将 PHP 升级到 7.2+,所以我降级了一个版本。

不建议在不从转储中恢复所有数据的情况下从 10.3.26 -> 10.3.25 开始,但我别无选择,而且似乎没有发生任何不好的事情。

# 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
于 2020-11-08T11:22:04.377 回答
1

这个突然的错误信息是由 MariaDB 客户端升级引起的,它似乎与 PHP 7.2 版本不兼容php-mysqlnd;版本10.2.35打破了它,但版本 10.2.34仍然有效。使用yumordnf可以轻松恢复到以前的版本,例如。和:

su
yum history
yum history undo 440

临时设置也可能有意义enabled=0。升级到 PHP 7.3 可能仍然是更好的选择(如果可用)。/etc/yum.repo.d/mariadb.repo

于 2020-11-11T09:53:18.637 回答
0

将 php 7.2 升级到 php7.4 对我来说是最好的方式。

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

sudo apt 更新

sudo apt install php7.4-fpm php7.4-common 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

须藤a2enconf php7.4-fpm

sudo systemctl 重新加载 apache2

须藤 systemctl 状态 php7.4-fpm `

固定的

于 2020-11-07T19:07:03.330 回答
0

经过许多解决方法后,我今天尝试了这个我得到的解决方案

1-升级到php 7.3或7.4
(许多网站在php升级后会宕机)

2-降级到次要版本(mariadb 10.4.16 到 10.4.15)

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

无论如何,这个问题是作为 Mariadb 昨晚更新的错误打开的,他们现在没有推动任何修复上述解决方案只是解决问题的 2 种方法,它适用于我将 mariadb 从 10.4.16 降级到 10.4.15 (小幅降级)

于 2020-11-05T17:40:04.520 回答
0

简单的解决方案只需将您​​的 PHP 更新到 7.3 在 Laravel 和 WP 中为我工作

于 2021-01-03T09:11:02.487 回答
0

如果您的查询没有与您传入的参数数组相同数量的输入参数,则可能会发生这种情况。这是我在 NodeJS + MYSQL 中的代码,它导致了这个问题:

const config = getMysqlConfig();

let arguments = [arg1, arg2];
const connection = await mysql.createConnection(config.db);

const result = await connection.execute('INSERT INTO mySchema.myTable(val1, val2) VALUES (?,?) ON DUPLICATE KEY UPDATE val1= val1+ ?', arguments)
.catch((err) => LogError(err));
connection.end(); 

因为我只有 2 个值arguments,但我的查询需要 3 个参数,所以malformed communication抛出了错误。对我来说,解决方案就是在数组中添加我的加法参数

let arguments = [arg1, arg2, arg3];
于 2021-06-24T13:28:28.407 回答