Подтвердить что ты не робот

Ошибка при отправке пакета QUERY

Я пытался вставить некоторые данные в базу данных, но я получил эту ошибку " Ошибка при отправке пакета QUERY"

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

но я думаю, что проблема в том, что размер данных превышает 16 МБ.
тип данных столбца задан как longtext, который, как я думаю, может хранить данные размером до 4 ГБ.

Я не знаю, есть ли у PDO проблемы с запуском запроса или передача 16 МБ данных в базу данных.
Это единственное предположение, которое я могу сделать, поскольку mysql может отправлять данные в пакетах, и пакет не может хранить данные размером до 16 МБ.

4b9b3361

Ответ 1

Вы догадались, что у MySQL есть ограничение на размер данных, вам нужно разбить запрос в небольшой группе записей или вы можете изменить свой max_allowed_packet с помощью SET GLOBAL max_allowed_packet=524288000;

Ответ 2

Вы можете решить эту проблему, выполнив следующие шаги:

1) откройте окно терминала

2) напишите следующую команду в терминале

ssh [email protected] 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'

Это работает для меня. Надеюсь, это сработает для вас.

Ответ 3

Эта ошибка также может возникнуть, если переменная wait_timeout слишком мала.

Если это так, вы можете установить его выше следующим образом:

SET GLOBAL wait_timeout=10;

Это было решением для той же ошибки в моем случае.

Ответ 4

В /etc/my.cnf добавить:

  max_allowed_packet=32M

Это сработало для меня. Вы можете проверить, перейдя в PHPMyAdmin и открыв окно команд SQL и выполнив:

SHOW VARIABLES LIKE  'max_allowed_packet'

Ответ 5

Я столкнулся с редким случаем края в cygwin, где я получил бы эту ошибку при выполнении exec('rsync'); где-то перед запросом. Возможно, это общая проблема PHP, но я могу только воспроизвести это в cygwin с помощью rsync.

$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

Ответ 6

Вы не можете иметь предложение 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 мегабайта) вверх/вниз по мере необходимости. Вот ссылка на документацию MySQL по этому вопросу.

Ответ 7

Если при вставке "слишком большого количества данных" происходит сбой из-за настройки 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'));