Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/236.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 是否将文件保存到varbinary(max)字段?_Php_Sql Server_File Upload - Fatal编程技术网

Php 是否将文件保存到varbinary(max)字段?

Php 是否将文件保存到varbinary(max)字段?,php,sql-server,file-upload,Php,Sql Server,File Upload,我一整天都在做这件事,但我似乎不明白。我们的客户希望我们将他们上传的文件保存到数据库(mssql)中的一个表中。对于他们可以上传什么样的文件没有限制,所以根据我所掌握的有限知识,我在谷歌上搜索了一下,并尝试了以下方法: 我创建了这个表: CREATE TABLE files ( id int NOT NULL PRIMARY KEY IDENTITY, name varchar(256), content varbinary(max) NOT NULL, ty

我一整天都在做这件事,但我似乎不明白。我们的客户希望我们将他们上传的文件保存到数据库(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 本机客户端10.0][SQL 服务器]后未关闭的引号 字符串的����'. [42000][102][Microsoft][SQL Server 本机客户端10.0][SQL 服务器]附近的语法不正确'����'.

现在我想这是文件内容破坏SQL的问题,但是我不知道如何处理它们(或者如何将它们转换成不会破坏SQL的字符串)。任何帮助都将不胜感激,因为我对此完全不知所措


(是的,我知道我在这里没有保护自己免受攻击,但现在我只是想让基础知识发挥作用)

看一看:

看一看:

尝试使用fopen的二进制标志(
b
):


另外,我不确定您是否应该
addslashes
您的数据。我从未在PHP中使用过MSSQL,所以我说不出来。

尝试使用fopen的二进制标志(
b
):


另外,我不确定您是否应该
addslashes
您的数据。我从来没有在PHP中使用过MSSQL,所以我说不出来。

在我使用Microsofts sqlsrv驱动程序的情况下,到目前为止,最简单的方法是使用params!这样就避免了在二进制数据中使用引号,而且它会像引用一样进入数据库

代码段:

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

在我使用MicrosoftsSQLSRV驱动程序的情况下,到目前为止最简单的方法是使用params!这样就避免了在二进制数据中使用引号,而且它会像引用一样进入数据库

代码段:

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

您使用的是PHP的Mssql驱动程序还是Microsoft的sqlsrv?为什么对二进制数据调用
addslashes()
?@Hamish:我使用的是sqlsrv驱动程序@jnpcl:这是我忘记删除的东西(它现在不在我的代码中)。我基本上只是在试验,因为我的很多错误都与引号有关,所以我想看看它是否能解决问题。你还需要花一周的时间在网上展示它page@Col.弹片:我已经创建了一个脚本,一旦文件保存到数据库并对二进制数据进行编码后,就可以下载这些文件,就像下面提到的哈米什一样,我可以毫无问题地下载它们。我想可能会出现一些bug,但到目前为止还不错:)您是在使用PHP的Mssql驱动程序还是Microsoft的sqlsrv?为什么要对二进制数据调用
addslashes()
?@Hamish:我在使用sqlsrv驱动程序@jnpcl:这是我忘记删除的东西(它现在不在我的代码中)。我基本上只是在试验,因为我的很多错误都与引号有关,所以我想看看它是否能解决问题。你还需要花一周的时间在网上展示它page@Col.弹片:我已经创建了一个脚本,一旦文件保存到数据库并对二进制数据进行编码后,就可以下载这些文件,就像下面提到的哈米什一样,我可以毫无问题地下载它们。我想可能会出现一些bug,但到目前为止还不错:)谢谢!这就是我要找的。你不知道我在这方面做了多久了,处理文件不是我的强项:P我会在网站允许的情况下尽快做出正确的回答。谢谢!这就是我要找的。你不知道我在这方面做了多长时间了,处理文件不是我的强项:P我会在网站允许的情况下尽快把它变成正确的答案。是的,addslashes是我忘记从示例中删除的旧代码,现在不在那里。我将编辑我的问题以删除,以防它可以帮助别人。出于好奇,我添加了二进制标志,但它没有起作用。也许还有其他事情要做,但既然我的问题现在已经解决了,我就让它休息一下,继续讨论更大的问题:)是的,addslashes是我忘了从示例中删除的旧代码,现在不在其中。我将编辑我的问题以删除,以防它可以帮助别人。出于好奇,我添加了二进制标志,但它没有起作用。也许还有其他事情要做,但既然我的问题现在已经解决了,我就让它休息一下,然后再看更大的鱼:)