使用pdo将图像插入sql server db

时间:2015-07-30 07:34:14

标签: php pdo sql-server-2008-r2

$stmt=$con->query("insert into tbl(data) values(0x".$data1['hex'].")");

这是sql语句,它的工作正常。值

0xFFD8FFE000104A46494600010101006000600000FFDB00430... 

存储在数据库中,我已经检查过,图像被存储起来。但我试图使用PDO这样做,存储的值是不同的,不显示图像。这是我的代码

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

数据库中的值

0x30786666643866666530303031303461343634393436303...

有什么区别?我做错了吗? 我在php 5.6上使用SQL Server 2008R2和Microsoft pdo_odbc驱动程序。

1 个答案:

答案 0 :(得分:1)

Google首次点击mssql varbinary pdohttps://social.msdn.microsoft.com/forums/sqlserver/en-US/221dcea2-438d-4a3a-b438-b98bff8f3d57/using-pdostatementbindvalue-to-update-varbinary-fields

  

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

因此,$stmt->bindParam(':data', $data, PDO::PARAM_LOB, 0, PDO::SQLSRV_ENCODING_BINARY);应该有用吗?

编辑:Aaaaah,愚蠢的我:当然这不起作用。你没有传递二进制文件,你的字符串只是一个任意的ASCII字符串,看起来像十六进制编码的东西。转到这样的网站:http://www.rapidtables.com/convert/number/hex-to-ascii.htm,粘贴您的0x30786666643866666530303031303461343634393436303,转换为ASCII,您会得到什么? 0xffd8ffe000104a4649460,您的原始数据。

PDO / MSSQL认为您传递的二进制数据会转换为十六进制,因此0 ASCII为30十六进制,x78f66,依此类推,我希望你明白这一点。

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

该怎么办?只需忘记十六进制编码,让odbc驱动程序/ MSSQL处理转换。通过$datastring代替$data,您应该没事。