2015-06-29 16 views
6

Veritabanına dosya eklediğim bir sistem üzerinde çalışıyorum. DB'ye blob ekleyebilmemin iki yolu vardır, bu yüzden hangisinin daha iyi olduğunu merak ediyorum.PHP ile MySQL içine blob yerleştirmenin daha iyi yolu

ilk içeriği almak için ve daha sonra bir dize olarak içerik parametresi bağlamak eklerken:

$content = NULL; 
... 
$prep_stmt = "INSERT INTO dokumenty (name, size, type, content, autor, poznamka) VALUES (?, ?, ?, ?, ?, ?)"; 
     $stmt = $mysqli->prepare($prep_stmt); 
      $stmt->bind_param('sisbis',$fileName,$fileSize,$fileType,$content,$user_id,$poznamka); 
     $stmt->send_long_data(3, file_get_contents($tmpName)); 

Sorum şu:

$fp  = fopen($tmpName, 'r'); 
$content = fread($fp, filesize($tmpName)); 
$content = addslashes($content); 
fclose($fp); 
... 
$prep_stmt = "INSERT INTO dokumenty (name, size, type, content, autor, poznamka) VALUES (?, ?, ?, ?, ?, ?)"; 
     $stmt = $mysqli->prepare($prep_stmt); 
       $stmt->bind_param('sissis',$fileName,$fileSize,$fileType,$content,$user_id,$poznamka); 

başka yolu böyle send_long_data kullanmaktır : Her iki eser olarak hangi yolu kullanmak daha iyidir?

+1

Her ikisi de çalışıyor mu? Sorguya bağlamadan önce içeriğe addslash uygulayacağınız, bir çok durumda verilerin bozulacağı anlamına gelir. – symcbean

+0

Sadece metin dosyalarını geri yüklemeyi denedim ve işe yaradı, ama ikili dosyaları bozacak doğru olabilirsiniz ... çözüm aşağıdaki gibi cazip çalışır –

cevap

2

Send_long_data yönteminin kullanılması, bir dosyanın, MySQL sunucu kurulumunuzdaki max_allowed_packet değerine kıyasla çok büyük olduğu durumu çözmenize izin verecektir. Ancak, iki kodunuzun çalışması, testlerde bu sınıra ulaşmadığınızı gösterir. Send_long_data yöntemi, bir geçişte gönderilemeyecek kadar büyük olan verilerin kısmi "parçaları" olan bir döngüde birden çok kez çağrılacak şekilde tasarlanmıştır. Ayrıca, ikinci kod yazdığınız yoldan emin değilim çünkü dosya okunurken hatayla baş edemiyorsunuz.

define ('YOUR_MYSQL_MAX_ALLOWED_PACKET', 8192); 
$fp = fopen($tmpName, "r"); 
// TODO check here if fopen succeed 
$prep_stmt = "INSERT INTO dokumenty (name, size, type, content, autor, poznamka) VALUES (?, ?, ?, ?, ?, ?)"; 
$stmt = $mysqli->prepare($prep_stmt); 

while (!feof($fp)) { 
    $stmt->send_long_data(3, fread($fp, YOUR_MYSQL_MAX_ALLOWED_PACKET)); 
} 
fclose($fp); 

YOUR_MYSQL_MAX_ALLOWED_PACKET sabit değer MySQL özellikle kurulum için ayarlanması gerekir: Bu kod için üçüncü bir yol önerir.

İlgili konular