日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > php >内容正文

php

php varbinary,php – 无法从MSSQL中获取varbinary数据

發布時間:2023/12/10 php 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 php varbinary,php – 无法从MSSQL中获取varbinary数据 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

背景

開發環境:

在Windows 10 x64上使用Apache 2.4.16的PHP 7.0.3

SQL Server 2014標準版

服務器在相應的文件列上啟用了FileStream.

試圖安裝sqlsvr驅動程序但由于缺乏對PHP7的支持而失敗

使用驅動程序SQL Server從ODBC訪問SQL Server

PHP代碼將圖像數據插入MSSQL

$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();

PHP代碼從MSSQL保存圖像數據

$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)) );

以及此鏈接中說明的方法.

但兩者都沒有運氣,文件似乎也被破壞了.

任何幫助表示贊賞.

編輯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驅動程序.一切都有魅力.

現在,我們不需要使用這個新驅動程序轉換varbinary數據了.

解決方法:

當插入包含varbinary的表時,選擇數據類型對PHP PDO非常重要.

對于文件列,應使用PDO :: PARAM_LTR代替PDO :: PARAM_LTR

要確保DB通過驅動程序輸出正確的文件,請將VARBINARY(MAX)字段轉換為十六進制字符串,并通常使用此方法將其交給PHP CONVERT(VARCHAR(MAX),[FileColumn],2)

將列轉換為VARCHAR(MAX)而不是NVARCHAR(MAX),因為HEX字符串不需要任何Unicode支持并保留一個普通的HEX字符串.

然后十六進制字符串可以通過PHP函數hex2bin()有效地從十六進制數據轉換回二進制.

解決方案

$link = @new \PDO("odbc:Driver={SQL Server};Server=$server;Database=$db", $user, $password);

$stmt = $link->prepare("SELECT DATALENGTH([File]) AS [Size] , CONVERT(VARCHAR(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();

$result = $stmt->fetch(PDO::FETCH_ASSOC);

file_put_contents( "file" , hex2bin($result["File"]) );

附加信息

從SQL Server Native Client 11.0和ODBC驅動程序11 for SQL Server中選擇varbinary列時,既不將列轉換為varchar,也不會輸出損壞的二進制結果,這是不需要的.但是當我將列轉換為VARCHAR(MAX)時,驅動程序SQL Server成功向我返回一個HEX字符串.我懷疑這個動作是一個錯誤或驅動程序問題.

標簽:php,sql-server,pdo,php-7,sql-server-2014

來源: https://codeday.me/bug/20190516/1115975.html

總結

以上是生活随笔為你收集整理的php varbinary,php – 无法从MSSQL中获取varbinary数据的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。