Fout bij het verzenden van QUERY-pakket

ik probeerde wat gegevens in de database in te voegen, maar ik kreeg deze foutmelding “Fout tijdens het verzenden van QUERY-pakket

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

maar wat ik denk dat het probleem is, is dat de grootte van de gegevensmeer dan 16 MB is.
het gegevenstype van de kolom is ingesteld als longtext, waarvan ik denk dat het gegevens zo groot als 4 GB kan houden.

Ik weet niet of PDO’s problemen hebben met het uitvoeren van de query of het overbrengen van 16 MB aan gegevens naar de database.
Dat is de enige gok die ik kan maken, aangezien mysql de gegevens in pakkettenkan verzenden en het pakket geen gegevens kan bevatten die zo groot zijn als 16 MB.


Antwoord 1, autoriteit 100%

Je raadt het goed MySQL heeft een beperking voor de grootte van gegevens, je moet je zoekopdracht in een kleine groep records breken of je kunt je max_allowed_packet wijzigen door SET GLOBAL max_allowed_packet=524288000;


Antwoord 2, autoriteit 64%

U kunt dit probleem oplossen door enkele stappen te volgen:

1) open uw terminalvenster

2) schrijf het volgende commando in je terminal

ssh [email protected] port

3) Voer root-wachtwoord in

4) Bewerk nu uw server my.cnf-bestand met het onderstaande commando

nano /etc/my.cnf  

als de opdracht niet wordt herkend, doe dit dan eerst of probeer vi en herhaal: yum install nano.

OF

 vi /etc/my.cnf 

5) Voeg de regel toe onder het gedeelte [MYSQLD]. :

max_allowed_packet=524288000 (obviously adjust size for whatever you need) 
wait_timeout = 100

6) Control + O (opslaan) dan ENTER (bevestigen) dan Control + X (bestand afsluiten)

7) Start vervolgens uw mysql-server opnieuw door het volgende commando

/etc/init.d/mysql stop
/etc/init.d/mysql start

8) U kunt dit verifiëren door naar PHPMyAdmin te gaan of een SQL-opdrachtvenster te openen en het volgende uit te voeren:

SHOW VARIABLES LIKE 'max_allowed_packet'

Dit werkt voor mij. Ik hoop dat het voor jou zou moeten werken.


Antwoord 3, autoriteit 32%

Je kunt deze fout ook krijgen als de variabele wait_timeoutte laag is.

Als dat zo is, kunt u het zo hoger instellen:

SET GLOBAL wait_timeout=10;

Dit was de oplossing voor dezelfde fout in mijn geval.


Antwoord 4, autoriteit 8%

Voeg in /etc/my.cnftoe:

 max_allowed_packet=32M

Het werkte voor mij. U kunt dit verifiëren door naar PHPMyAdmin te gaan en een SQL-opdrachtvenster te openen en het volgende uit te voeren:

SHOW VARIABLES LIKE 'max_allowed_packet'

Antwoord 5, autoriteit 8%

Ik kwam een ​​zeldzame edge-case tegen in cygwin, waarbij ik deze foutmelding kreeg als ik exec('rsync');ergens voor de query deed. Het kan een algemeen PHP-probleem zijn, maar ik kon dit alleen in cygwin reproduceren met 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'));

produceert

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 gemeld in https://cygwin.com/ml/cygwin/ 2017-05/msg00272.html


Antwoord 6, autoriteit 4%

U mag de WHERE-clausule niet in een INSERT-instructie hebben.

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

Zou moeten zijn

insert into table1(data) VALUES(:data)


Update: je hebt dat uit je code verwijderd (ik neem aan dat je de code verkeerd hebt gekopieerd). U wilt uw toegestane pakketgrootte vergroten:

SET GLOBAL max_allowed_packet=32M

Verander de 32M(32 megabytes) naar wens omhoog/omlaag. Hier is een link naar de MySQL-documentatie over dit onderwerp.


Antwoord 7

Als het invoegen van ‘te veel gegevens’ mislukt vanwege de instelling max_allowed_packetvan de databaseserver, wordt de volgende waarschuwing weergegeven:

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

Als deze waarschuwing als uitzondering wordt gezien (vanwege de ingestelde foutafhandeling), is de databaseverbinding (waarschijnlijk) verloren, maar de toepassing weet dit niet (mislukte invoegingen kunnen verschillende oorzaken hebben).
De volgende vraag in de rij, die zo simpel kan zijn als:

SELECT 1 FROM DUAL

Zal dan mislukken met de fout die deze SO-vraag begon:

Error while sending QUERY packet. PID=18486

Eenvoudig testscript om mijn uitleg te reproduceren, probeer het met en zonder de error handler om het verschil in impact te zien:

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

Antwoord 8

Had zo’n probleem bij het uitvoeren van forking in php voor de opdrachtregel. In mijn geval heeft de php van tijd tot tijd het onderliggende proces gedood. Om dit op te lossen, hoeft u alleen maar te wachten tot het proces is voltooid met het commando pcntl_wait($status);

hier is een stukje code voor een visueel voorbeeld:

   #!/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);
    ?>

Other episodes