使用PHP向SQLITE插入BLOB类型二进制数据

Posted on 2011-05-13 11:46  Trail  阅读(1877)  评论(0编辑  收藏  举报

这几天项目中遇到一个问题,就是需要将二进制数据插入到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,但是实现方式和原理,已经步骤是一样的

Copyright © 2024 Trail
Powered by .NET 9.0 on Kubernetes