Váš dotaz SQL pravděpodobně překračuje max_allowed_packet velikost, v takovém případě se server odpojí.
Mohlo by vás zajímat mysqli_stmt ::send_long_data
což umožňuje posílat parametry delší než max_allowed_packet v blocích.
Aktualizace:"Jak to mohu změnit? Je použití mysqli jedinou možností?"
Afaik hodnotu nelze změnit na základě jednotlivých relace, tj. pokud nemůžete změnit konfiguraci serveru (my.cnf nebo spouštěcí parametry) bude hodnota pouze pro čtení. edit:Jak naznačuje komentář, můžete změnit globální hodnotu serveru mysql po jeho spuštění, pokud máte příslušná oprávnění
.PDO/PDO_MYSQL (od verze php 5.3.0) se nezdá na podporu send_long_data, ale ani tím si nejsem jistý. Zůstane tak mysqli
jako jediná možnost. Nedávno jsem si všiml, že Wez Furlong
spojené přetečení zásobníku. Protože je jedním z autorů implementace PDO, mohl by vědět (ačkoli nenapsal pdo_mysql modul).
(Zcela netestovaný a ošklivý) příklad
// $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();