Php 使用pdo将映像插入sql server数据库

Php 使用pdo将映像插入sql server数据库,php,pdo,sql-server-2008-r2,Php,Pdo,Sql Server 2008 R2,这是sql语句,它工作得很好。价值 $stmt=$con->query("insert into tbl(data) values(0x".$data1['hex'].")"); 存储在数据库中,我已经检查过,图像被存储。但是我尝试使用PDO来实现这一点,存储的值不同,并且不显示图像。这是我的密码 0xFFD8FFE000104A46494600010101006000600000FFDB00430... 数据库中的值 $datastring = file_get_contents(

这是sql语句,它工作得很好。价值

$stmt=$con->query("insert into tbl(data) values(0x".$data1['hex'].")");
存储在数据库中,我已经检查过,图像被存储。但是我尝试使用PDO来实现这一点,存储的值不同,并且不显示图像。这是我的密码

0xFFD8FFE000104A46494600010101006000600000FFDB00430... 
数据库中的值

$datastring = file_get_contents("image.JPG");
$data1 = unpack("H*hex", $datastring);
$data = '0x'.$data1['hex'];

$stmt=$conp->prepare("insert into tbl(data) values(:data)");
$stmt->bindparam(':data', $data);
$stmt->execute();
有什么不同?我做错什么了吗?
我正在PHP5.6上使用SQL Server 2008R2和Microsoft pdo_odbc驱动程序。

mssql varbinary pdo的第一次Google点击:

$sth->bindParam(1,$pswd,PDO::PARAM_LOB,0,PDO::SQLSRV_ENCODING_BINARY)

因此,
$stmt->bindParam(':data',$data,PDO::PARAM_LOB,0,PDO::SQLSRV_ENCODING_BINARY)应该工作吗

编辑:啊,愚蠢的我:这当然不行。你没有传递二进制,你的字符串只是一个任意的ASCII字符串,看起来像是十六进制编码的东西。转到这样的站点:,粘贴您的
0x3078666643866653030303130346134363634393436303
,转换为ASCII,您会得到什么<代码>0xFFD8FF000104A4649460,您的原始数据

发生的情况是,PDO/MSSQL认为您正在传递二进制数据,并将其转换为十六进制,因此
0
ASCII是
30
hex,
x
78
f
66
等等,我希望您能理解

与第一个工作示例的区别很微妙:您没有在传递的值(
0x…
)周围加引号,因此,它被视为十六进制形式的“真正二进制”。在PDO方法中,传递的值可以说是由PDO在内部“引用”,例如,用于防止SQL注入攻击。如果在第一个示例周围加上引号,那么应该得到与PDO相同的结果


怎么办?简单地忘记十六进制编码,让odbc驱动程序/MSSQL处理转换。通过
$datastring
而不是
$data
,您应该会没事。

在您的工作示例中,
$data1['hex']
是如何填充的?数据库中
数据
列的类型是什么?如果是BLOB列,可能值得尝试添加
PDO::PARAM_LOB
作为
bindparam
的第三个参数。我将数据存储在数据库的varbinary(max)字段中。我也尝试过第三个论点,但它不起作用。无论如何,谢谢。那么,PDO::PARAM_LOB
有什么不同吗?我的第一个问题呢?它与那里的
文件\u get\u contents()
相同。我忘了提那件事了。对不起,还是一样的。相同的值存储在db中。没有图像。
0x30786666643866666530303031303461343634393436303...