忙了好久從傍晚開始想把第一個項目的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); } ?>
|