я пытался вставить некоторые данные в базу данных, но я получил эту ошибку « Ошибка при отправке пакета 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 МБ.
Вы догадались, что у MySQL есть ограничение на размер данных, вам нужно разбить свой запрос в небольшой группе записей или вы можете изменить свой max_allowed_packet с помощью SET GLOBAL max_allowed_packet=524288000;
Вы можете решить эту проблему, выполнив следующие шаги:
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'
Это работает для меня. Надеюсь, это сработает для вас.
Вы также можете получить эту ошибку, если переменная wait_timeout
слишком низкая.
Если это так, вы можете установить его выше:
SET GLOBAL wait_timeout 10
Это решение для той же ошибки в моем случае.
В /etc/my.cnf
добавьте:
max_allowed_packet=32M
Это сработало для меня. Вы можете проверить, перейдя в PHPMyAdmin и открыв окно командной строки SQL и выполнив:
SHOW VARIABLES LIKE 'max_allowed_packet'
Я столкнулся с редким случаем в 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
Вы не можете иметь 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 по этому вопросу.