2011-02-16 325 views
0

我一直在這一整天,我似乎無法弄清楚。我們的客戶希望我們將他們上傳的文件保存到我們數據庫(mssql)的表格中。目前,以什麼樣的文件,他們可以上傳所以以下的有限的知識,我有我做了一些谷歌搜索,並試圖沒有限制如下:將文件保存到varbinary(max)字段?

我創造了這個表:

CREATE TABLE files 
    (
    id int NOT NULL PRIMARY KEY IDENTITY, 
    name varchar(256), 
    content varbinary(max) NOT NULL, 
    type varchar(30) NOT NULL, 
    size int NOT NULL 
    table_id INT NOT NULL FOREIGN KEY REFERENCES myTable(id) 
    ); 

然後我嘗試添加的內容是這樣的:

$newfileName = $_FILES['uploadfile']['name']; 
$newtmpName = $_FILES['uploadfile']['tmp_name']; 
$newfileSize = $_FILES['uploadfile']['size']; 
$newfileType = $_FILES['uploadfile']['type']; 

//need to get the content of the file 
$fp = fopen($newtmpName, 'r'); 
$file_content = fread($fp, filesize($newtmpName)); 
$file_content = $file_content; 
fclose($fp); 

$sql = 'INSERT INTO files ([name], [content], [type], [size], [table_id]) VALUES ("'.$newfileName.'",CAST("'.$file_content.'" AS varbinary(max)),"'.$newfileType.'","'.$newfileSize.'","'.$table_id.'")'; 

,但它只是不工作......我可以上傳txt文件沒有問題,但任何東西都不會剛剛突破。我得到的錯誤,如下面的(這與每一個文件的不同):

[42000] [105] [微軟] [SQL 服務器]閉合的引號之後[ 本機客戶端10.0的SQL Server] 字符字符串' '。 [42000] [102] [Microsoft] [SQL Server Native Client 10.0] [SQL 服務器]「 」附近的語法不正確。

現在我明白這是該文件的打破了SQL內容的問題,但我有不知道如何對付它們(或如何將它們轉換成不會打破SQL字符串)。任何幫助將不勝感激,因爲我完全失去了這一點。

(是的,我知道我還沒有從攻擊保護自己這裏,但現在我只是想獲得基本工作)

+0

您是否使用PHP的Mssql中的驅動程序或微軟的SQLSRV? – Hamish 2011-02-16 20:09:27

+0

你爲什麼要在二進制數據上調用`addslashes()`? – drudge 2011-02-16 20:10:45

+0

@Hamish:我正在使用sqlsrv驅動程序。 @jnpcl:這是我忘記刪除的東西(它現在不在我的代碼中)。我基本上只是在嘗試,因爲我的很多錯誤都與引號有關,所以我想看看它是否能解決問題。 – Gazillion 2011-02-16 20:15:58

回答

0

使用的fopen的嘗試二進制標誌(b):

$fp = fopen($newtmpName, 'rb'); 
$file_content = fread($fp, filesize($newtmpName)); 

而且,我不知道,你應該addslashes您的數據。我從來沒有在PHP中使用MSSQL,所以我不能說。

1

在我的情況下與微軟sqlsrv驅動程序到目前爲止最簡單的方法是使用params!避免使用引用您的二進制數據,並進入數據庫,就像它...

代碼片段:

$sql = "INSERT INTO tablename (binaryImageField) VALUES (CAST (? AS varbinary(max)))"; 
$params = array($binaryImageData); 
sqlsrv_query($con,$sql,$params); 
相關問題