【发布时间】:2016-06-06 09:28:49
【问题描述】:
背景
开发环境:
Windows 10 x64 上的 PHP 7.0.3 和 Apache 2.4.16
SQL Server 2014 标准版
服务器在相应的文件列上启用了 FileStream。
尝试安装sqlsvr驱动,但由于缺乏对PHP7的支持而失败
使用驱动程序SQL Server从 ODBC 访问 SQL 服务器
将图像数据插入 MSSQL 的 PHP 代码
$link = @new \PDO("odbc:Driver={SQL Server};Server=$server;Database=$db", $user, $password);
$stmt = $link->prepare("INSERT INTO [Attachment] (AttID, Seq , ModuleCde, AppID, StaffID , FileName , [File]) VALUES ( NEWID() , ? , ? , ? , ? , ? , ? )");
$stmt->bindValue(1,$_POST["Seq"],PDO::PARAM_INT);
$stmt->bindValue(2,$_POST["ModuleCde"],PDO::PARAM_STR);
$stmt->bindValue(3,$_POST["AppID"],PDO::PARAM_STR);
$stmt->bindValue(4,$_SESSION["StaffID"],PDO::PARAM_STR);
$stmt->bindValue(5,$_FILES["file"]["name"][$_POST["Seq"]],PDO::PARAM_STR);
$stmt->bindValue(6,file_get_contents($_FILES["file"]["tmp_name"][$_POST["Seq"]]),PDO::PARAM_STR);
$stmt->execute();
从 MSSQL 保存图像数据的 PHP 代码
$link = @new \PDO("odbc:Driver={SQL Server};Server=$server;Database=$db", $user, $password);
$stmt = $link->prepare("SELECT DATALENGTH([File]) AS [Size] , CONVERT(NVARCHAR(MAX),[File],2) AS [File] FROM [Attachment] WHERE [ModuleCde] = ? AND [AppID] = ? AND [Seq] = ? AND [StaffID] = ?");
$stmt->bindValue(1,$_GET["ModuleCde"],PDO::PARAM_STR);
$stmt->bindValue(2,$_GET["AppID"],PDO::PARAM_STR);
$stmt->bindValue(3,$_GET["Seq"],PDO::PARAM_STR);
$stmt->bindValue(4,$_SESSION["StaffID"],PDO::PARAM_STR);
$stmt->execute();
$stmt->bindColumn(2,$img,PDO::PARAM_LOB, 0);
$stmt->fetch(PDO::FETCH_ASSOC);
file_put_contents( "file" , $img );
文件已成功上传到 SQL 服务器。打开SQL Server的DATA目录,所有上传的文件都可以用Paint打开了。
但从上述图像保存代码中提取的文件已损坏。该文件缺少原始文件中的一些字节。
方法尝试
fwrite( fopen("file","w+") , strtolower("0x".str_replace("\0","",$img)) );
以及此链接中所述的方法。
Php with MSSQL display raw data from varbinary field
但是两者都没有运气,文件似乎也已损坏。
感谢任何帮助。
编辑 2016-02-25
修改SQL语句如下,但输出文件仍然损坏。
$link->prepare("SELECT DATALENGTH([File]) AS [Size] , [File] FROM [Attachment] WHERE [ModuleCde] = ? AND [AppID] = ? AND [Seq] = ? AND [StaffID] = ?");
我现在正在尝试更改不同的 SQL server ODBC 驱动程序以查看文件是否可以成功输出。
编辑 2016-08-09
使用适用于 PHP 7 的更新的 MSSQL PDO 驱动程序。一切都以魅力再次运行。
现在,我们不再需要使用这个新驱动程序convert varbinary 数据了。
【问题讨论】:
标签: php sql-server pdo sql-server-2014 php-7