2015-06-29 13 views
6

Sto lavorando su un sistema in cui inserisco i file nel database. Ci sono due modi in cui sono in grado di inserire BLOB in DB, quindi sono curioso su quale sia il migliore.Un modo migliore per inserire blob in MySQL con PHP

Il primo è quello di ottenere il contenuto e quindi associare il parametro di contenuti come una stringa quando si inserisce:

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

L'altro modo è quello di utilizzare send_long_data come questo:

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

La mia domanda è : quale modo è meglio utilizzare come entrambi i lavori?

+1

Entrambi funzionano? Che stai applicando addslashes al contenuto prima di legarlo alla query significa che in molti casi i dati saranno corrotti. – symcbean

+0

Ho provato a scaricare solo i file di testo e ha funzionato, ma potresti avere ragione che corromperà ai file binari ... la soluzione qui sotto funziona come un incantesimo –

risposta

2

L'utilizzo del metodo send_long_data consente di risolvere il caso in cui un file è troppo grande rispetto al valore max_allowed_packet nella particolare configurazione del server MySQL. Tuttavia il fatto che i tuoi due codici funzionino dimostra che non hai raggiunto questo limite nei test. Il metodo send_long_data è stato progettato per essere chiamato più volte in un ciclo con "blocchi" parziali dei dati troppo grandi per essere inviati in un unico passaggio. Inoltre non mi piace il modo in cui hai scritto il secondo codice perché non sei in grado di gestire l'errore durante la lettura del file. Io suggerisco una terza via per codificare questo:

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

Qualora il valore costante YOUR_MYSQL_MAX_ALLOWED_PACKET deve essere regolato per la vostra particolare configurazione di MySQL.

Problemi correlati