Лучший способ вставить blob в MySQL с PHP

Я работаю над системой, в которую я вставляю файлы в базу данных. Есть два способа, как я могу вставить blob в DB, поэтому мне любопытно, какой из них лучше.

сначала нужно получить содержимое, а затем привязать параметр содержимого в виде строки при вставке:

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

другой способ-использовать send_long_data следующим образом:

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

мой вопрос: какой способ лучше использовать и как работает?

1 ответов


использование метода send_long_data позволит вам решить случай, когда файл слишком велик по сравнению со значением max_allowed_packet в вашей конкретной настройке сервера MySQL. Однако тот факт, что ваши два кода работают, показывает, что вы не достигли этого предела в своих тестах. Метод send_long_data был разработан для вызова несколько раз в цикле с частичными "кусками" данных, слишком большими для отправки за один проход. Кроме того, мне не нравится, как вы написали второй код, потому что вы не могут обрабатывать ошибки во время чтения файла. Я предложу третий способ кодирования этого:

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 должно быть настроено на вашу конкретную настройку MySQL.