j'essayais d'insérer des données dans la base de données mais j'ai eu cette erreur " Erreur lors de l'envoi du paquet QUERY "
$insertDeta = $conPat->prepare("insert into table1(data) VALUES(:data)");
$insertDeta->bindParam(':data',$data);
$conPat->beginTransaction();
$insertDeta->execute();
$conPat->commit();
mais ce que je pense le problème est que la taille de la data est plus de 16MB.
le type de données de la colonne est défini sur longtext , ce qui, à mon avis, permet de conserver des données aussi grandes que 4 Go.
Je ne sais pas si les PDO ont des problèmes pour exécuter la requête ou transférer 16 Mo de données vers la base de données.
C’est la seule chose que je puisse faire, car mysql pourrait envoyer les données dans paquets et le paquet ne peut contenir des données d’une taille maximale de 16 Mo.
Vous avez bien deviné que MySQL a une limite de taille des données, vous devez diviser votre requête en un petit groupe d'enregistrements ou vous pouvez modifier votre max_allowed_packet à l'aide de SET GLOBAL max_allowed_packet=524288000;
Vous pouvez résoudre ce problème en suivant quelques étapes:
1) ouvrez votre fenêtre de terminal
2) s'il vous plaît écrivez la commande suivante dans votre terminal
ssh root@yourIP port
3) Entrez le mot de passe root
4) Maintenant, éditez le fichier my.cnf de votre serveur en utilisant la commande ci-dessous
nano /etc/my.cnf
si la commande n'est pas reconnue, faites ceci d'abord ou essayez vi puis répétez: miam installez nano.
OU
vi /etc/my.cnf
5) Ajoutez la ligne sous la section [MYSQLD]. :
max_allowed_packet=524288000 (obviously adjust size for whatever you need)
wait_timeout = 100
6) Ctrl + O (enregistrer) puis ENTER (confirmer) puis Ctrl + X (fichier de sortie)
7) Puis redémarrez votre serveur mysql en suivant la commande
/etc/init.d/mysql stop
/etc/init.d/mysql start
8) Vous pouvez vérifier en accédant à PHPMyAdmin ou en ouvrant une fenêtre de commande SQL et en exécutant:
SHOW VARIABLES LIKE 'max_allowed_packet'
Cela fonctionne pour moi. J'espère que cela fonctionnera pour vous.
Vous pouvez également avoir cette erreur si la variable wait_timeout
est trop basse.
Si oui, vous pouvez le placer plus haut comme ça:
SET GLOBAL wait_timeout 10
C'était la solution pour la même erreur dans mon cas.
Dans /etc/my.cnf
ajouter:
max_allowed_packet=32M
Cela a fonctionné pour moi. Vous pouvez vérifier en accédant à PHPMyAdmin, en ouvrant une fenêtre de commande SQL et en exécutant:
SHOW VARIABLES LIKE 'max_allowed_packet'
J'ai rencontré un cas rare d'Edge dans cygwin, où j'obtiendrais cette erreur en faisant exec('rsync');
quelque part avant la requête. Peut-être un problème général PHP, mais je ne pouvais le reproduire que dans cygwin avec 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'));
produit
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)
Bug signalé dans https://cygwin.com/ml/cygwin/2017-05/msg00272.html
Si l'insertion de "trop de données" échoue en raison du paramètre max_allowed_packet
du serveur de base de données, l'avertissement suivant est émis:
SQLSTATE[08S01]: Communication link failure: 1153 Got a packet bigger than
'max_allowed_packet' bytes
Si cet avertissement est intercepté comme une exception (en raison du gestionnaire d'erreurs set), la connexion à la base de données est (probablement) perdue, mais l'application l'ignore (les échecs peuvent avoir plusieurs causes) ... , qui peut être aussi simple que:
SELECT 1 FROM DUAL
Echouera alors avec l'erreur cette question SO a commencé:
Error while sending QUERY packet. PID=18486
Script de test simple pour reproduire mon explication, essayez-le avec et sans le gestionnaire d'erreurs pour voir la différence d'impact:
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'));