这几天项目中遇到一个问题,就是需要将二进制数据插入到sqlite里面。试过N多方法,折腾了好多种办法都不行,后来发现是PDO的一个BUG造成的,该bug已经在php5.3.4之后解决。下面说一下5.2下面的解决办法
刚开始使用pack将数据转换的二进制,转换之后存入一个dat文件,用ue打开文件,数据是正确的。但是存入数据库就出错。上代码
foreach ((array)$terminallogos as $k=>$v){ //$ret[$k] = ”; $id = $v->id; $width = $v->width; $height = $v->height; $content = file_get_contents(param(‘terminallogoPath’).$v->logofile); $contents = explode(“\n”, trim($content)); foreach ((array)$contents as $v){ $cc = explode(‘ ‘, $v); foreach((array)$cc as $vv){ $ret[$k] = $ret[$k] . pack(“c”,hexdec(substr(trim($vv),0,2))); } } $logosql = “insert into tlogo (id,width,height,data) values (“.$id.”, “.$width.”,”.$height.”,:data)”; $command = $this->connection->createCommand($logosql); $command->prepare(); $command->bindValue(“:data”,$ret[$k],PDO::PARAM_LOB); $command->execute(); }
在这思路上折腾了一天没有找到好的办法,后来发现是PDO的BUG。转换了思路
贴代码
foreach ((array)$contents as $v){ $cc = explode(‘ ‘, $v); foreach((array)$cc as $vv){ $ret[$k] = $ret[$k] . substr($vv,0,2); } } $command = $this->connection->createCommand(“insert into tlogo (id,width,height,data) values (“.$id.”, “.$width.”,”.$height.”,X’”.$ret[$k].”‘);”); $command->prepare(); $command->execute();
我们改用直接串接十六进制的数。然后插入时候 X’”.$ret.”‘) 用X标记一下。这个就可以。叙述的不是很清楚。大家看看代码的实现吧。框架用的是YII,但是实现方式和原理,已经步骤是一样的