Truy vấn sql của bạn có thể vượt quá max_allowed_packet kích thước trong trường hợp máy chủ sẽ ngắt kết nối.
Bạn có thể quan tâm đến mysqli_stmt ::send_long_data
cho phép bạn gửi các tham số dài hơn max_allowed_packet theo từng phần.
Cập nhật:"Làm cách nào để thay đổi nó? Sử dụng mysqli có phải là lựa chọn duy nhất không?"
Afaik không thể thay đổi giá trị trên cơ sở mỗi phiên, tức là nếu bạn không thể thay đổi cấu hình máy chủ (my.cnf hoặc tham số khởi động) giá trị sẽ ở chế độ chỉ đọc. chỉnh sửa:Như nhận xét cho thấy bạn có thể thay đổi giá trị chung của máy chủ mysql sau khi nó đã được khởi động nếu bạn có các quyền thích hợp
.PDO / PDO_MYSQL (kể từ phpversion 5.3.0) dường như không để hỗ trợ send_long_data, nhưng tôi cũng không chắc về điều đó. Điều đó sẽ để lại mysqli
là lựa chọn duy nhất. Gần đây tôi đã nhận thấy rằng Wez Furlong
đã tham gia tràn ngăn xếp. Vì anh ấy là một trong những tác giả của việc triển khai PDO mà anh ấy có thể biết (mặc dù anh ấy không viết pdo_ mysql mô-đun).
Ví dụ (hoàn toàn chưa được kiểm tra và xấu xí)
// $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();