Din sql-forespørgsel overstiger sandsynligvis max_allowed_packet
a> størrelse, i hvilket tilfælde serveren afbrydes.
Du kan være interesseret i mysqli_stmt ::send_long_data
som giver dig mulighed for at sende parametre længere end max_allowed_packet i bidder.
Opdatering:"Hvordan kan jeg ændre det? Er det den eneste mulighed at bruge mysqli?"
Afaik kan værdien ikke ændres på en per-session-base, dvs. hvis du ikke kan ændre serverkonfigurationen (my.cnf eller opstartsparametre) vil værdien være skrivebeskyttet. edit:Som kommentaren antyder, kan du ændre den globale værdi af mysql-serveren efter den er startet, hvis du har de korrekte tilladelser
.PDO/PDO_MYSQL (fra phpversion 5.3.0) synes ikke for at understøtte send_long_data, men det er jeg heller ikke sikker på. Det ville efterlade mysqli
som eneste mulighed. Jeg har for nylig bemærket, at Wez Furlong
sammenføjet stak overløb. Da han er en af forfatterne til PDO-implementeringen, kender han det måske (selvom han ikke skrev pdo_mysql modul).
(Fuldstændig uafprøvet og grimt) eksempel
// $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();