从php插入/读取blob数据


inserting/reading blob data from php

我使用以下脚本测试插入和读取blob数据。

插入脚本:

include('session.php');
$provider      =$_POST['provider_id'];
$trd_period    =$_POST['trading_period_month'];
$pdf_statement =stream_get_contents(fopen($_FILES['pdf_statement']['tmp_name'], 'rb'));
$pdf_statement_clean=addslashes($pdf_statement);

$insert="update rd_provider_statement
         set pdf_statement='".$pdf_statement_clean."', creation_user_id='SCO'
         where  provider_id='".$provider."' and trading_period_month='".$trd_period."'";
mysql_query($insert);
mysql_query("COMMIT"); 
echo mysql_error();

下载脚本:

include('session.php');
//Gather Post Variables
$TP_Month  =$_POST["trading_period_month"];
$provider =$_POST["provider_id"];
$TP_format =substr($TP_Month, 0, 7);
//Download Statement
$sql_qry="select *
          from   rd_provider_statement
          where  provider='".$provider."' and trading_period_month='".$TP_Month."'";
$sql_err_no=sql_select($sql_qry,$sql_res,$sql_row_count,$sql_err,$sql_uerr);
$row = mysql_fetch_assoc($sql_res);
$bytes =stripslashes($row['pdf_statement']);
header("Content-type: application/pdf");
header('Content-disposition: attachment; filename="'.$provider.'statement'.$TP_format.'"');
print $bytes;

但是,当下载文件时,它无法打开,因为它不是支持的格式。我使用另一个页面上脚本的基础从数据库下载blob数据,但这里插入数据库是通过mysql过程而不是PHP完成的。我认为是我的插入脚本造成了问题。

尝试使用mysql_real_escape_string()而不是addslashes()。它可能会解决你的问题。

为了调试,你可以在插入数据库之前和检索之后计算字符串的md5()。我敢打赌,你会得到不同的哈希,这意味着你没有正确插入它,并且你的二进制数据在插入数据库时会损坏。

旁注:

  • 不要使用这样的插入,使用绑定-如何在Php中绑定SQL变量
  • 检查错误并停止,不要简单地回显它们(我希望你在生产代码中这样做)

通常,您不希望在http头描述之前有任何输出代码。看见http://php.net/manual/en/function.header.php

将文件名和其他文件信息存储在会话中,然后在另一个页面中访问它们。

你需要检查的几件事:

  • my.ini中的max_allowed_packet应等于或高于您希望存储在数据库中的文件大小
  • 检查所选的数据类型是否适合要存储的文件。有小水滴、博客、中水滴和长水滴。你可能想试试最大的,那就是长斑点
  • 我不确定这一点,但你是否已经检查过file_get_contents是否有效:

mysql_real_escape_string(file_get_contents($file))

这是我的另一个答案。

首先更新查询:

准备文件(假设您的文件不是二进制文件):

    $tmpName = $_FILES["pdf_statement"]["tmp_name"];
    $fp = fopen($tmpName, 'r');
    $data = fread($fp, filesize($tmpName));
    $data = addslashes($data);
    fclose($fp);

$insert="update rd_provider_statement
         set pdf_statement='".$data."', creation_user_id='SCO'
         where  provider_id='".$provider."' and trading_period_month='".$trd_period."'";

下载:

enter code here
$sql_qry="select provider_id, pdf_statement
          from   rd_provider_statement
          where  provider='".$provider."' 
         and trading_period_month='".$TP_Month."'";
$sql_err_no=sql_select($sql_qry,$sql_res,$sql_row_count,$sql_err,$sql_uerr);
$row = mysql_fetch_assoc($sql_res);
    $name=$row['provider_id'];
    $file=$row['pdf_statement'];

header("Content-Disposition: attachment; filename='".$name_statement.$TP_format.'";" );
echo $file;

希望它能有所帮助=)