我一直在这一整天,我似乎无法弄清楚。我们的客户希望我们将他们上传的文件保存到我们数据库(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字符串)。任何帮助将不胜感激,因为我完全失去了这一点。
(是的,我知道我还没有从攻击保护自己这里,但现在我只是想获得基本工作)
您是否使用PHP的Mssql中的驱动程序或微软的SQLSRV? – Hamish 2011-02-16 20:09:27
你为什么要在二进制数据上调用`addslashes()`? – drudge 2011-02-16 20:10:45
@Hamish:我正在使用sqlsrv驱动程序。 @jnpcl:这是我忘记删除的东西(它现在不在我的代码中)。我基本上只是在尝试,因为我的很多错误都与引号有关,所以我想看看它是否能解决问题。 – Gazillion 2011-02-16 20:15:58