Mysql
 sql >> Base de données >  >> RDS >> Mysql

Problème de taille de téléchargement en PHP et MySql

Votre requête sql dépasse probablement le max_allowed_packet size auquel cas le serveur se déconnectera.
Vous pourriez être intéressé par
mysqli_stmt ::send_long_data qui vous permet d'envoyer des paramètres plus longs que max_allowed_packet en morceaux.

Mise à jour :"Comment puis-je le changer ? Utiliser mysqli est-il la seule option ?" paramètres de démarrage), la valeur sera en lecture seule. modifier :comme le commentaire le suggère, vous pouvez modifier la valeur globale du serveur mysql après son démarrage si vous avez les bonnes autorisations .PDO/PDO_MYSQL (à partir de phpversion 5.3.0) ne semble pas pour prendre en charge send_long_data, mais je n'en suis pas sûr non plus. Cela laisserait mysqli comme seule option. J'ai récemment remarqué que Wez Furlong débordement de la pile jointe. Puisqu'il est l'un des auteurs de l'implémentation de PDO, il le sait peut-être (bien qu'il n'ait pas écrit le pdo_mysql module).

Exemple (complètement non testé et moche)

// $mysqli = new mysqli(....
$fp = fopen($_FILES['binFile']['tmp_name'], 'rb') or die('!fopen');

//$result = $mysqli->query('SELECT @@max_allowed_packet') or die($mysqli->error);
//$chunkSize = $result->fetch_all();
//$chunkSize = $maxsize[0][0];
$chunkSize = 262144; // 256k chunks

$stmt = $mysqli->prepare('INSERT INTO foo (desc, bindata) VALUES (?,?)') or die($mysqli->error);
// silently truncate the description to 8k
$desc = 8192 < strlen($_POST['txtDescription']) ? $_POST['txtDescription'] : substr($_POST['txtDescription'], 0, 8192);
$stmt->bind_param('sb', $desc, null);

while(!feof($fp)) {
  $chunk = fread($fp, $chunkSize);
  $stmt->send_long_data(1, $chunk) or die('!send_long_data.'.$stmt->error);
}
$result = $stmt->execute();