Mysql
 sql >> Database >  >> RDS >> Mysql

Carica problema di dimensione in PHP e MySql

La tua query sql probabilmente supera il max_allowed_packet dimensione nel qual caso il server si disconnetterà.
Potrebbe interessarti mysqli_stmt ::send_long_data che ti consente di inviare parametri più lunghi di max_allowed_packet in blocchi.

Aggiornamento:"Come posso cambiarlo? L'uso di mysqli è l'unica opzione?" parametri di avvio) il valore sarà di sola lettura. modifica:come suggerisce il commento, puoi modificare il valore globale del server mysql dopo che è stato avviato se hai le autorizzazioni appropriate .PDO/PDO_MYSQL (a partire dalla versione php 5.3.0) non sembra per supportare send_long_data, ma non sono sicuro nemmeno di questo. Ciò lascerebbe mysqli come unica opzione. Di recente ho notato che Wez Furlong overflow dello stack unito. Dal momento che è uno degli autori dell'implementazione PDO potrebbe sapere (sebbene non abbia scritto pdo_mysql modulo).

Esempio (completamente non testato e brutto)

// $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();