忙了好久从傍晚开始想把第一个项目的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); } ?>
|