使用mysqli Prepare发送STMT_PREPARE数据包时出错

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用mysqli Prepare发送STMT_PREPARE数据包时出错相关的知识,希望对你有一定的参考价值。

我正在运行一个cron工作来发送电子邮件。发送电子邮件后,我更新数据库以标记它们已发送:

$stmt = $this->mysqli->prepare($q))

但我收到错误:Error while sending STMT_PREPARE packet. PID=25982;

错误显示正在执行的代码,并且IN子句中有大约50个整数id用于表的主键:

准备('更新电子邮件设置datesent ='2015-08-28 19:35:49'电子邮件在哪里(?,?,?,?,?,?,?,?,?,?,?,?,?, ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?, ?,?,?,?,?,?,?,?,?,?,?,?)“)

我在共享服务器上,因此更改mysql设置的能力有限。

除了减少?声明中IN的数量,还有什么我可以做的吗?它适用于少量数据。这真的被认为是大量的数据让它窒息吗?

来自phpinfo

mysqli
MysqlI Support  enabled
Client API library version  mysqlnd 5.0.11-dev - 20120503 - $Id: 15d5c781cfcad91193dceae1d2cdd127674ddb3e $ 
Active Persistent Links     0 
Inactive Persistent Links   0 
Active Links    0 

Directive   Local Value
mysqli.allow_local_infile   On
mysqli.allow_persistent On
mysqli.default_host no value
mysqli.default_port 3306
mysqli.default_pw   no value
mysqli.default_socket   /var/lib/mysql/mysql.sock
mysqli.default_user no value
mysqli.max_links    Unlimited
mysqli.max_persistent   Unlimited
mysqli.reconnect    Off

**更新**我的解决方案是使用以下方法设置会话变量:

mysqli->query("SET session wait_timeout=28800");
答案

尝试在/etc/my.cnf中增加这些值

max_allowed_packet
wait_timeout
另一答案

我也遇到了这个问题 - 我在做一些测试的同时在我的文件中添加了sleep(60);线。

根本问题是mysqli连接已经超时。您可以通过此测试检查:

if ($mysqli->ping()) {
    // Connected.
}
else {
    // Not connected.
}

要解决您的问题,您可以增加mysqli超时值(例如,请参阅http://php.net/manual/en/mysqli.options.php)。

和/或,如果您发现没有连接(即,在尝试执行mysqli操作之前使用上面的代码),您应该能够重新启动连接。 (在此之前,首先调用$mysqli->close();可能是必要/最安全的,只是为了确保旧资源正确释放。)

以上是关于使用mysqli Prepare发送STMT_PREPARE数据包时出错的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 mysqli->prepare 执行更新?

调用“mysqli_stmt_prepare”时是不是应该手动检查错误? [复制]

如何在使用 mysqli prepare 时获取 assoc 数组

mysqli 预处理

使用 mysqli_stmt_prepare 准备查询,在 WHERE 之后绑定逻辑条件

如何使用索引号将数据发送到mysqli(准备好的语句)