Ваш sql-запрос, вероятно, превышает размер max_allowed_packet , и в этом случае сервер отключается.
Возможно, вас заинтересует mysqli_stmt :: send_long_data , который позволяет отправлять параметры длиннее, чем max_allowed_packet, в чанках.
Обновление: «Как я могу изменить его? Является ли использование mysqli единственным вариантом?»
Afaik значение не может быть изменено для каждой сессии, то есть, если вы не можете изменить конфигурацию сервера (my.cnf или параметры запуска), значение будет доступно только для чтения. редактировать: как говорится в комментарии, вы можете изменить глобальное значение сервера mysql после его запуска, если у вас есть соответствующие права .
PDO / PDO_MYSQL (по состоянию на phpversion 5.3.0) не кажется для поддержки send_long_data, но я тоже не уверен в этом. Это оставило бы mysqli как единственный вариант. Недавно я заметил, что Wez Furlong переполнение стека. Поскольку он является одним из авторов реализации PDO, он может знать (хотя он не писал модуль pdo_ mysql ).
(полностью непроверенный и безобразный) пример
// $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();