【问题标题】:MariaDB Prepared Statement Returns Malformed communication packetMariaDB Prepared Statement 返回格式错误的通信数据包
【发布时间】:2021-02-17 08:18:57
【问题描述】:

我今天早上刚开始在一些租用的服务器空间上从几个准备好的语句中收到一个错误:“格式错误的通信数据包。”

这似乎只发生在准备好的语句上。此代码已在服务器上使用多年,但今天开始抛出错误。

这个简单的语句抛出错误:

$stmt=$conn->prepare("SELECT RootedID, WeekDate, Qty FROM inventoryrooted");
$stmt->execute();
echo $stmt->error;
$stmt->bind_result($code, $WeekDate, $Qty);
$stmt->store_result();
while($stmt->fetch()){
     $stmtInsertRC->execute();
}
$stmt->close();

如果我将其更改为普通连接,它可以正常工作:

$sql = "SELECT RootedID, WeekDate, Qty FROM inventoryrooted";
$result = $conn->query($sql);
while($row = $result->fetch_assoc()) {
 $code = $row["RootedID"];
 $WeekDate = $row["WeekDate"];
 $Qty = $row["Qty"];        
 $stmtInsertRC->execute();
}

我在网站上准备了数百条运行良好的声明。这似乎只发生在几张桌子上。巧合的是,我今天早上在 Navicat 中打开了这两个表来查看数据……不确定这是否会损坏它们? 我已经尝试修复表格,制作新副本并恢复表格。我还要求站点管理员重新启动 MariaDB(仍在等待)。

有人对我应该在哪里寻找解决方案有任何建议吗?我是不是找错树了?

10.3.26-MariaDB

PHP 7.2.34

【问题讨论】:

  • 经过更多检查,它似乎发生在几张桌子上。我仍然看不到一个模式,期望它总是一个 SELECT 语句。看起来准备好的 UPDATE 和 INSERT 语句很好。

标签: php mysql mariadb prepared-statement


【解决方案1】:

您的问题很可能是由您的主机升级到昨天发布的 MariaDB 10.3.26 造成的。请参阅MDEV-24121 了解更多信息。我还没有听到很好的解释,但有报道称降级 MariaDB、将 PHP 升级到 7.3 或 enabling PDO 暂时解决了这个问题。

我相信将其添加到您的代码中将启用准备好的语句模拟:

$conn->setAttribute(PDO::ATTR_EMULATE_PREPARES, true);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-24
    • 2011-10-21
    • 2012-10-19
    • 2022-07-07
    • 1970-01-01
    • 2012-02-24
    相关资源
    最近更新 更多