2012-07-12 123 views
0

我正在使用以下腳本來測試插入,然後讀取blob數據。從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。我認爲這是我的插入腳本導致問題。

+0

在數據庫中存儲文件不是一個好主意:http://stackoverflow.com/questions/3748/storing-images-in-db-yea-or-nay – 2012-07-12 06:30:29

+0

因此,如果您正在託管,並且沒有其他方式在文件系統上存儲/檢索文件,那麼您將如何訪問,存儲和檢索文件?有時他們已經得到了嚴格的PHP/MySQL交易,或者他們限制/過濾了您的文件上傳或其他內容。 – 2013-02-05 11:54:07

回答

1

嘗試使用mysql_real_escape_string()代替addslashes()。它可能會解決你的問題。

對於調試,您可以取回後插入到數據庫,然後之前計算字符串的md5()。我敢打賭,你會得到不同的哈希值,這意味着你沒有正確插入它,並且當插入數據庫時​​,你的二進制數據會被破壞。

旁註:

  • 不要使用這樣的插入,使用綁定 - How to bind SQL variables in Php?
  • 檢查錯誤和停止,不要簡單地附和他們(我希望你在你的產品代碼這樣做)
+0

我原本有mysql_real_escape_string(),但在無法工作後更改爲斜線。 MD5檢查返回完全不同的哈希值。但我不知道爲什麼。生產代碼在出錯時會停止並回滾任何更改......因爲這僅用於測試,所以我希望儘可能保持代碼儘可能小,直到它正在工作爲止 – user1488434 2012-07-12 06:44:16

+0

DB中的列是BLOB(二進制)或TEXT(具有字符集支持,並可能會改變一些字符)? – Quamis 2012-07-12 06:53:31

+0

中等BLOB,也許我會用mysql的load_file()來代替? – user1488434 2012-07-12 06:55:47

1

一般來說,你不希望你的HTTP標頭說明之前有任何輸出代碼。見http://php.net/manual/en/function.header.php

無論是在會話中存儲的文件名和其他文件信息,然後只需訪問它們在另一頁。

,你需要檢查幾件事情:

  • max_allowed_pa​​cket的在my.ini的應該比你期待在數據庫中存儲
  • 檢查,以查看文件大小相等或更高您選擇的數據類型適合您要存儲的文件。有一個小小的blob,博客,中等blob和長blob。你可能想嘗試最長的blob。
  • 我不知道這一個,但你已經檢查的file_get_contents工作:

mysql_real_escape_string(file_get_contents($file))

0

這裏是我的備選答案。

首先更新查詢:

準備文件(假設你的文件不是二進制文件):

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

希望它可以幫助=)