Ответ 1
Вы догадались, что у MySQL есть ограничение на размер данных, вам нужно разбить запрос в небольшой группе записей или вы можете изменить свой max_allowed_packet с помощью SET GLOBAL max_allowed_packet=524288000;
Я пытался вставить некоторые данные в базу данных, но я получил эту ошибку " Ошибка при отправке пакета 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 [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'
Это работает для меня. Надеюсь, это сработает для вас.
Эта ошибка также может возникнуть, если переменная 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 по этому вопросу.
Если при вставке "слишком большого количества данных" происходит сбой из-за настройки 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'));