<?php /** * ODBC to mySQL * 徐祖寧 (嘮叨) * czjsz_ah@stats.gov.cn * * 初次接觸php+mysql的朋友,有很多是ASP的高手。為使盡快上手 * 特寫此程序,用于將原有的數據庫通過ODBC數據源轉換到mysql * 其實此類程序有很多,精華區中也有不少。 * 本程序的特點在于只需知道數據源名和mysql的庫名即可。程序將 * 根據數據源中的表自動進行工作。 * */ set_time_limit(0);
$dsn = "tjtz";// 數據源名 $dsn_name = "";// 數據源用戶名 $dsn_pass = "";// 數據源口令
$sql = "tjtz";// mysql庫名,通常可用數據源名 $sql_host = "";// mysql服務器名 $sql_name = "";// mysql用戶名 $sql_pass = "";// mysql口令
$odbc = odbc_connect($dsn,$dsn_name,$dsn_pass); $result = odbc_tables($odbc);
$fields = odbc_num_fields($result);
if(! function_exists("odbc_fetch_array")) { // 檢查函數odbc_fetch_array是否存在,若沒有則定義 // 手冊上說有這個函數,但4.1.2中肯定沒有 // 注意,使用odbc_fetch_into回串的數組只能用下標訪問 function odbc_fetch_array(&$result) { $ar = array(); odbc_fetch_into($result,$ar); return $ar; } } // 獲取庫中的表 while($ar[] = odbc_fetch_array($result)); // 定義過濾函數 function filter($var) { return ($var[3] == "TABLE"); } // 篩選出用戶表 $ar = array_filter($ar,"filter"); foreach($ar as $tab) { $tables[] = $tab[2]; } // 生成建表文檔,若存在則不執行 if(! file_exists("$sql.sql")) { // 提取各表的字段信息 $fp = fopen("$sql.sql","w"); foreach($tables as $table) { $result = odbc_do($odbc,"select * from $table"); $str = sprintf("create table %s (",$table); for($i=0;$i<odbc_num_fields($result);$i++) { if(eregi("DOUBLE",odbc_field_type($result,$i+1))) { $s = sprintf("%s%s %s" ,($i>0?", ":"") ,odbc_field_name($result,$i+1) ,odbc_field_type($result,$i+1) ); }else if(eregi("COUNTER",odbc_field_type($result,$i+1))) { $s = sprintf("%s%s TINYINT(%s) AUTO_INCREMENT PRIMARY KEY" ,($i>0?", ":"") ,odbc_field_name($result,$i+1) ,odbc_field_len($result,$i+1) ); }else { $s = sprintf("%s%s %s(%s)" ,($i>0?", ":"") ,odbc_field_name($result,$i+1) ,odbc_field_type($result,$i+1) ,odbc_field_len($result,$i+1) ); } $str .= $s; } $str .= ");\n"; fputs($fp,$str); } fclose($fp); echo "已產生了建表表文件$sql.sql。<br>"; echo "請檢查命令是否正確。若不需要重新建表,請將下面的if(1) 改為if(0)<br>"; echo "不要改變表名,要增加字段請放在后面!"; echo "確認后重新運行本程序!"; odbc_close($odbc); exit; }
if(1) { // 若不需要重新建表,請將if(1) 改為if(0) echo "開始建表...<br>"; $mysql = mysql_connect(); mysql_drop_db($sql); mysql_create_db($sql); mysql_select_db($sql); $fp = fopen("$sql.sql","r"); $buffer = fread($fp,filesize("$sql.sql")); fclose($fp); $ar = split("\n",$buffer); foreach($ar as $query) { if(trim($query) != "") { //echo "$query<br>"; mysql_query($query,$mysql); } } }
// 從建表文件提取表信息信息 $info = array(); $s = file("$sql.sql"); foreach($s as $value) { if(eregi("create +table +([a-z0-9_-]+) *[\(](.+)[\)]",$value,$regs)) { $table = $regs[1]; $info[$table] = array(); $ar = split(",",$regs[2]); foreach($ar as $v) { sscanf($v,"%s %s",$p,$p); if(eregi("double|count|int",$p)) { // 這些類型不需要加'',還有那些? $info[$table][] =""; }else { $info[$table][] ="'"; } } } }
$mysql = mysql_connect($sql_host,$sql_name,$sql_pass); mysql_select_db($sql);
echo "<br>正在將數據從DSN向mySQL轉移..."; foreach($info as $key => $ar) { $query = "select * from $key"; // 生成ODBC查詢 $result = odbc_do($odbc,$query); $mode = true; while($rs = odbc_fetch_array($result)) { $sql_query = "insert into $key values ("; for($i=0;$i<count($rs);$i++) { if($i > 0) $sql_query .= ","; $sql_query .= "{$ar[$i]}{$rs[$i]}{$ar[$i]}"; } $sql_query .= ")"; mysql_query($sql_query,$mysql); } }
odbc_close($odbc); echo "<br>操作結束"; ?>
|