$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驱动程序。
答案 0 :(得分:1)
Google首次点击mssql varbinary pdo
:https://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
十六进制,x
为78
, f
是66
,依此类推,我希望你明白这一点。
与您的第一个工作示例的区别是微妙的:您不会在传递的值(0x...
)周围加上引号,因此,它以十六进制的形式被视为“真正的二进制”。在您的PDO方法中,所传递的值,即所谓的,由PDO在内部“引用”,例如,防止SQL注入攻击。如果你在第一个例子中加上引号,你应该得到与PDO相同的结果。
该怎么办?只需忘记十六进制编码,让odbc驱动程序/ MSSQL处理转换。通过$datastring
代替$data
,您应该没事。