Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Masalah ukuran unggahan di PHP dan MySql

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana saya bisa menghapus memori saat menjalankan skrip PHP yang panjang? mencoba tidak disetel()

  2. MySQL - mengapa tidak mengindeks setiap bidang?

  3. Apakah fungsi MySQL TRIM tidak memangkas jeda baris atau carriage return?

  4. Fungsi MySql yang tidak digunakan lagi

  5. Masalah Menyiapkan Modul MySQLdb