使用 PHP 将 blob 插入 MySQL 的更好方法
Better way to insert blob into MySQL with PHP
我正在开发一个将文件插入数据库的系统。
有两种方法可以将 blob 插入数据库,所以我很好奇哪种方法更好。
首先是获取内容,然后在插入的时候将内容的参数绑定为字符串:
$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));
我的问题是:两种方法哪个更好用?
使用 send_long_data 方法可以解决文件与特定 MySQL 服务器设置中的 max_allowed_packet 值相比太大的情况。但是,您的两个代码有效的事实表明您在测试中没有达到此限制。 send_long_data 方法被设计为在循环中多次调用,部分 "chunks" 数据太大而无法一次发送。此外,我不赞成您编写第二个代码的方式,因为您无法在文件读取期间处理错误。我将建议第三种编码方式:
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 特定设置进行调整。
我正在开发一个将文件插入数据库的系统。 有两种方法可以将 blob 插入数据库,所以我很好奇哪种方法更好。
首先是获取内容,然后在插入的时候将内容的参数绑定为字符串:
$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));
我的问题是:两种方法哪个更好用?
使用 send_long_data 方法可以解决文件与特定 MySQL 服务器设置中的 max_allowed_packet 值相比太大的情况。但是,您的两个代码有效的事实表明您在测试中没有达到此限制。 send_long_data 方法被设计为在循环中多次调用,部分 "chunks" 数据太大而无法一次发送。此外,我不赞成您编写第二个代码的方式,因为您无法在文件读取期间处理错误。我将建议第三种编码方式:
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 特定设置进行调整。