Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Problema de tamanho de upload em PHP e MySql


Sua consulta sql provavelmente excede o max_allowed_packet tamanho, caso em que o servidor será desconectado.
Você pode estar interessado em mysqli_stmt ::send_long_data que permite enviar parâmetros maiores que max_allowed_packet em pedaços.

Atualização:"Como posso alterá-lo? Usar o mysqli é a única opção?"
Afaik o valor não pode ser alterado em uma base por sessão, ou seja, se você não pode alterar a configuração do servidor (my.cnf ou parâmetros de inicialização) o valor será somente leitura. edit:Como o comentário sugere, você pode alterar o valor global do servidor mysql depois de iniciado se tiver as permissões adequadas .PDO/PDO_MYSQL (a partir do phpversão 5.3.0) não parece para suportar send_long_data, mas também não tenho certeza disso. Isso deixaria mysqli como única opção. Recentemente, notei que Wez Furlong estouro de pilha unida. Como ele é um dos autores da implementação do PDO, ele deve saber (embora ele não tenha escrito o pdo_mysql módulo).

Exemplo (completamente não testado e feio)
// $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();