忙了好久从傍晚开始想把第一个项目的sqlite转为mysql,毕竟mysql比较正式点,sqlite也许只能作为玩具,sqlite好多的查询语句 都是不标准的,再跟它纠缠下去对自己发展很不利。不过也要感谢它为我学sql有个很好的开始。算来今天是第一次正经的用mysql做点事情。数据库转换的 第一件事就是建立跟sqlite对应的表,没有采用什么技巧,直接套用建立sqlite数据库用的sql脚本,亮点就是自动删除已存在的的同名表。接下来 的工作就是遍历sqlite中表的结构,采用foreach语句来完成,开始发现读出的数据一直不对,尝试用zend studio的debug功能来查看sqlite_fetch_array返回的数组结构,结果失败了,debug不识别sqlite函数。搞了半天才知 道用print_s()函数输出数组结构,发现返回的数值很古怪,每个结果有两个脚标,一个是数字的,一个是表字段名,如下所示:
Array ( [0] => Array ( [0] => 1 [id] => 1 [1] => Admin [name] => Admin [2] => c4ca4238a0b923820dcc509a6f75849b [passwd] => c4ca4238a0b923820dcc509a6f75849b [3] => 0 [class] => 0 [4] => 2005-11-01 10:44:36 [regtime] => 2005-11-01 10:44:36 ) [1] => Array ( [0] => 2 [id] => 2 [1] => 管理员 [name] => 管理员 [2] => c4ca4238a0b923820dcc509a6f75849b [passwd] => c4ca4238a0b923820dcc509a6f75849b [3] => 1 [class] => 1 [4] => 2005-11-05 11:01:51 [regtime] => 2005-11-05 11:01:51 ) )
想了好久才想出一个取单值办法,并想个办法构造插入sql语句,还好mysql手册中有例程,原本想把表的字段提取出来在用insert into table (字段列表) values(字段对应的值)这种比较啥的方式插入的,经查手册发现,可以直接用insert into table values(字段列表),由于每个表有个主键是auto_increment的,不运行插入具体的值,可用null来插进去。整个代码如下,尝试了 php5的错误处理方法,跟java是一样的。还有就是从php5.1.2开始php.ini中short_tags 是off的,这样形如<?=$var?>的标签就不能用,搞得discuz4都装不上。打开后才能装!!
转换程序代码:
<?php
include("class/mysql.php");
try{
$link=new DB_MySQL();
$link->connect();
$link->selectdb();
$db=sqlite_open("mssql.php");
$tables=array("admin","class","config","linkcon","loginlog","content");
foreach ($tables as $value){
transfer($value);
}
$link->close();
}catch(Exception $e){
print $e->getMessage();
exit();
}
//数据转移函数,输入值为表名,可自动清空目标表
function transfer($table)
{
global $link,$db;
$query="select id from $table";
$link->query($query);
if($link->affected_rows()!=0){
$query="truncate $table";
$link->query($query);
}
$query="select * from $table";
$array=sqlite_array_query($db,$query);
$query="insert into $table values (null";
$flag=0;
foreach($array as $row){
$i=1;
$j=0;
if($flag==1)
$query.=",(null";
foreach($row as $col){
if($j%2!=0 && $j>2){
$query.=',''.$row[$i++].''';
}
$j++;
}
$query=$query.")";
$flag=1;
}
$link->query($query);
}
?>
(阅读次数:)