使用PHP将blob插入MySQL的更好方法

Mi *_* Ro 6 php mysql blob

我正在研究一个将文件插入数据库的系统.我有两种方法可以将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 );
Run Code Online (Sandbox Code Playgroud)

另一种方法是像这样使用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));
Run Code Online (Sandbox Code Playgroud)

我的问题是:哪种方式更适合使用?

小智 2

使用 send_long_data 方法可以解决文件相对于特定 MySQL 服务器设置中的 max_allowed_pa​​cket 值太大的情况。然而,您的两个代码有效的事实表明您在测试中没有达到此限制。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);
Run Code Online (Sandbox Code Playgroud)

其中 YOUR_MYSQL_MAX_ALLOWED_PACKET 常量值必须根据您的 MySQL 特定设置进行调整。