发送QUERY数据包时出错

时间:2015-06-10 10:26:55

标签: php mysql

我试图将一些数据插入数据库但是我收到了这个错误" 发送QUERY数据包时出错"

$insertDeta = $conPat->prepare("insert into table1(data) VALUES(:data)");
$insertDeta->bindParam(':data',$data);
$conPat->beginTransaction();    
    $insertDeta->execute();
$conPat->commit();

但我认为问题是数据的大小超过16MB 列的数据类型设置为 longtext ,我认为可以将数据保持为4GB。

我不知道PDO是否在运行查询或将16MB数据传输到数据库时遇到问题 这是我可以做出的唯一猜测,因为mysql可能会在数据包中发送数据,而数据包无法容纳16MB的数据。

8 个答案:

答案 0 :(得分:30)

您猜对了MySQL对数据大小有限制,您需要在一小组记录中破解您的查询,或者您可以使用SET GLOBAL max_allowed_packet=524288000;更改您的max_allowed_pa​​cket

答案 1 :(得分:26)

您可以按照以下几个步骤解决此问题:

1)打开终端窗口

2)请在终端中写下以下命令

ssh root@yourIP port

3)输入root密码

4)现在使用以下命令编辑服务器my.cnf文件

nano /etc/my.cnf  

如果无法识别命令,请先执行此操作或尝试使用vi然后重复:yum install nano。

  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

8)您可以通过进入PHPMyAdmin或打开SQL命令窗口并执行:

进行验证
SHOW VARIABLES LIKE 'max_allowed_packet'

这对我有用。我希望它适合你。

答案 2 :(得分:11)

如果变量wait_timeout太低,您可能也会遇到此错误。

如果是这样,您可以将其设置得更高:

SET GLOBAL wait_timeout 10

这是我案例中同样错误的解决方案。

答案 3 :(得分:4)

/etc/my.cnf添加:

  max_allowed_packet=32M

它对我有用。您可以通过进入PHPMyAdmin并打开SQL命令窗口并执行:

进行验证
SHOW VARIABLES LIKE  'max_allowed_packet'

答案 4 :(得分:3)

我在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

中报告的错误

答案 5 :(得分:1)

您不能在WHERE声明中包含INSERT子句。

insert into table1(data) VALUES(:data) where sno ='45830'

应该是

insert into table1(data) VALUES(:data)

更新:您已从代码中删除了该代码(我假设您错误地复制了代码)。您希望增加允许的数据包大小:

SET GLOBAL max_allowed_packet=32M

根据需要更改32M(32兆字节)。 Here is a link to the MySQL documentation on the subject.

答案 6 :(得分:0)

如果由于数据库服务器的max_allowed_packet设置而导致“插入太多数据”失败,则会引发以下警告:

SQLSTATE[08S01]: Communication link failure: 1153 Got a packet bigger than 
'max_allowed_packet' bytes

如果此警告被捕获为异常(由于设置了错误处理程序),则数据库连接(可能)丢失了,但应用程序对此一无所知(失败的插入可能有多种原因)。 行中的下一个查询,可以很简单:

SELECT 1 FROM DUAL

然后会失败,并显示此SO问题开始的错误:

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'));

答案 7 :(得分:0)

在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);
    ?>