Php 使用pdo将映像插入sql server数据库
这是sql语句,它工作得很好。价值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(
$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...