Twoje zapytanie sql prawdopodobnie przekracza max_allowed_packet size w takim przypadku serwer się rozłączy.
Może być zainteresowany mysqli_stmt ::send_long_data
co pozwala na wysyłanie parametrów dłuższych niż max_allowed_packet w porcjach.
Aktualizacja:"Jak mogę to zmienić? Czy używanie mysqli jest jedyną opcją?"
Afaik tej wartości nie można zmienić na podstawie sesji, tj. jeśli nie można zmienić konfiguracji serwera (my.cnf lub parametry startowe) wartość będzie tylko do odczytu. edit:Jak sugeruje komentarz, możesz zmienić globalną wartość serwera mysql po jego uruchomieniu, jeśli masz odpowiednie uprawnienia
.PDO/PDO_MYSQL (od wersji 5.3.0) nie wydaje się do obsługi send_long_data, ale tego też nie jestem pewien. To pozostawiłoby mysqli
jako jedyna opcja. Niedawno zauważyłem, że Wez Furlong
przepełnienie połączonego stosu. Ponieważ jest jednym z autorów implementacji PDO, może znać (chociaż nie napisał pdo_mysql moduł).
(Całkowicie nieprzetestowany i brzydki) przykład
// $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();