我整天都在这,我似乎无法弄明白。我们的客户希望我们将他们上传的文件保存到我们数据库(mssql)的表中。对于他们可以上传什么类型的文件没有限制,所以在我有限的知识后,我做了一些谷歌搜索并尝试了以下内容:
我创建了这个表:
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] [Microsoft] [SQL Server Native Client 10.0] [SQL 服务器]之后的未闭合引号 字符串' '。 [42000] [102] [微软] [SQL Server Native Client 10.0] [SQL 服务器]' '附近的语法不正确。
现在我认为这是打破SQL的文件内容的一个问题,但我有 NO CLUE 如何处理它们(或者如何将它们转换为不会破坏的字符串sql)。任何帮助都会非常感激,因为我完全迷失了。
(是的,我知道我没有在这里保护自己免受攻击,但是现在我只是想让基础工作起作用)
答案 0 :(得分:1)
答案 1 :(得分:1)
在我的情况下使用Microsofts sqlsrv-Driver到目前为止最简单的方法是使用params!这样可以避免在二进制数据中使用引号,并且它就像它一样进入数据库......
代码段:
$sql = "INSERT INTO tablename (binaryImageField) VALUES (CAST (? AS varbinary(max)))";
$params = array($binaryImageData);
sqlsrv_query($con,$sql,$params);
答案 2 :(得分:0)
尝试使用fopen的二进制标志(b
):
$fp = fopen($newtmpName, 'rb');
$file_content = fread($fp, filesize($newtmpName));
此外,我不确定您应该addslashes
您的数据。我从未在PHP中使用MSSQL,所以我不知道。