Kueri sql Anda mungkin melebihi max_allowed_packet ukuran dalam hal ini server akan terputus.
Anda mungkin tertarik dengan mysqli_stmt ::send_long_data
yang memungkinkan Anda mengirim parameter lebih lama dari max_allowed_packet dalam potongan.
Pembaruan:"Bagaimana saya bisa mengubahnya? Apakah menggunakan mysqli adalah satu-satunya pilihan?"
Afaik nilainya tidak dapat diubah pada basis per sesi, yaitu jika Anda tidak dapat mengubah konfigurasi server (my.cnf atau parameter startup) nilainya akan menjadi hanya-baca. edit:Seperti yang disarankan oleh komentar, Anda dapat mengubah nilai global server mysql setelah dimulai jika Anda memiliki izin yang tepat
.PDO/PDO_MYSQL (mulai phpversi 5.3.0) tidak tampak untuk mendukung send_long_data, tetapi saya juga tidak yakin tentang itu. Itu akan meninggalkan mysqli
sebagai satu-satunya pilihan. Saya baru-baru ini memperhatikan bahwa Wez Furlong
bergabung dengan stack overflow. Karena dia adalah salah satu penulis implementasi PDO, dia mungkin tahu (meskipun dia tidak menulis pdo_mysql modul).
(Benar-benar belum teruji dan jelek) contoh
// $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();