Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Vấn đề kích thước tải lên trong PHP và MySql

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();


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Phân trang bằng MySQL LIMIT, OFFSET

  2. Cách cấp tất cả các đặc quyền cho người dùng root trong MySQL 8.0

  3. Truy vấn mysql like% chậm với chỉ mục toàn văn bản

  4. Nhận tên cột bảng trong MySQL?

  5. So sánh INT không có câu lệnh WHERE