我试图插入一些数据到数据库中,但我得到了这个错误"错误,而发送查询包"
$insertDeta = $conPat->prepare("insert into table1(data) VALUES(:data)");
$insertDeta->bindParam(':data',$data);
$conPat->beginTransaction();
$insertDeta->execute();
$conPat->commit();
但是我认为问题是数据的大小超过16MB。
列的数据类型设置为longtext,我认为可以保持数据大到4GB。
我不知道PDOs是否有问题运行查询或传输16MB的数据到数据库。
这是我唯一的猜测,因为mysql可能以数据包发送数据,数据包不能容纳16MB的数据
你猜对了MySQL对数据大小有限制,你需要打破你的查询在小组记录或者你可以改变你的max_allowed_packet使用SET GLOBAL max_allowed_packet=524288000;
您可以通过以下几个步骤解决这个问题:
1)打开终端窗口2)请在您的终端中写入以下命令
ssh root@yourIP port
3)输入root密码
现在使用下面的命令
编辑您的服务器my.cnf文件nano /etc/my.cnf
如果无法识别命令,请先执行此操作或尝试使用vi,然后重复:
或
vi /etc/my.cnf
5)在[MYSQLD]部分下面添加一行。:
max_allowed_packet=524288000 (obviously adjust size for whatever you need)
wait_timeout = 100
6) Control + O(保存)然后ENTER(确认)然后Control + X(退出文件)
7)然后重新启动mysql服务器,执行命令/etc/init.d/mysql stop
/etc/init.d/mysql start
您可以通过进入PHPMyAdmin或打开SQL命令窗口并执行以下命令来验证:
SHOW VARIABLES LIKE 'max_allowed_packet'
这对我有用。我希望它对你有用。
如果变量wait_timeout
太低,也可能出现此错误。
如果是,你可以把它设置得更高:
SET GLOBAL wait_timeout=10;
In /etc/my.cnf
add:
max_allowed_packet=32M
它对我有效。您可以通过进入PHPMyAdmin并打开SQL命令窗口并执行以下命令来验证:
SHOW VARIABLES LIKE 'max_allowed_packet'
我在cygwin中遇到了一个罕见的边缘情况,在查询之前的某个地方执行exec('rsync');
时会出现此错误。这可能是一个常见的PHP问题,但我只能用rsync在cygwin中重现。
$pdo = new PDO('mysql:host=127.0.0.1;dbname=mysql', 'root');
var_dump($pdo->query('SELECT * FROM db'));
exec('rsync');
var_dump($pdo->query('SELECT * FROM db'));
生产
object(PDOStatement)#2 (1) {
["queryString"]=>
string(16) "SELECT * FROM db"
}
PHP Warning: Error while sending QUERY packet. PID=15036 in test.php on line 5
bool(false)
https://cygwin.com/ml/cygwin/2017-05/msg00272.html
不能在INSERT
语句中使用WHERE
子句。
insert into table1(data) VALUES(:data) where sno ='45830'
insert into table1(data) VALUES(:data)
Update:您已经从代码中删除了它(我假设您错误地复制了代码)。您想要增加允许的数据包大小:
SET GLOBAL max_allowed_packet=32M
根据需要上下更改32M
(32兆字节)。这里是关于这个主题的MySQL文档的链接
如果由于数据库服务器的max_allowed_packet
设置导致插入'too much data'失败,则引发以下警告:
SQLSTATE[08S01]: Communication link failure: 1153 Got a packet bigger than
'max_allowed_packet' bytes
如果此警告被捕获为异常(由于设置错误处理程序),则数据库连接(可能)丢失,但应用程序不知道这一点(插入失败可能有几个原因)。下一个查询,可以像下面这样简单:
SELECT 1 FROM DUAL
将失败,错误提示this SO-question started:
Error while sending QUERY packet. PID=18486
简单的测试脚本来重现我的解释,尝试使用和不使用错误处理程序来查看影响的差异:
set_error_handler(function($errno, $errstr, $errfile, $errline, array $errcontext) {
// error was suppressed with the @-operator
if (0 === error_reporting()) {
return false;
}
throw new ErrorException($errstr, 0, $errno, $errfile, $errline);
});
try
{
// $oDb is instance of PDO
var_dump($oDb->query('SELECT 1 FROM DUAL'));
$oStatement = $oDb->prepare('INSERT INTO `test` (`id`, `message`) VALUES (NULL, :message);');
$oStatement->bindParam(':message', $largetext, PDO::PARAM_STR);
var_dump($oStatement->execute());
}
catch(Exception $e)
{
$e->getMessage();
}
var_dump($oDb->query('SELECT 2 FROM DUAL'));
在php中执行命令行分叉时遇到了这样的问题。在我的例子中,php有时会杀死子进程。要解决这个问题,只需使用命令pcntl_wait($status);
等待进程完成下面是一段可视示例代码:
#!/bin/php -n
<?php
error_reporting(E_ALL & ~E_NOTICE);
ini_set("log_errors", 1);
ini_set('error_log', '/media/logs/php/fork.log');
$ski = substr(str_shuffle(str_repeat("0123456789abcdefghijklmnopqrstuvwxyz", 5)), 0, 5);
error_log(getmypid().' '.$ski.' start my php');
$pid = pcntl_fork();
if($pid) {
error_log(getmypid().' '.$ski.' start 2');
// Wait for children to return. Otherwise they
// would turn into "Zombie" processes
// !!!!!! add this !!!!!!
pcntl_wait($status);
// !!!!!! add this !!!!!!
} else {
error_log(getmypid().' '.$ski.' start 3');
//[03-Apr-2020 12:13:47 UTC] PHP Warning: Error while sending QUERY packet. PID=18048 in /speed/sport/fortest.php on line 22457
mysqli_query($con,$query,MYSQLI_ASYNC);
error_log(getmypid().' '.$ski.' sleep child');
sleep(15);
exit;
}
error_log(getmypid().' '.$ski.'end my php');
exit(0);
?>