繁体中文
设为首页
加入收藏
当前位置:PHP技术首页 >> 数据库相关 >> ODBC to mySQL

ODBC to mySQL

2004-10-01 08:26:10  作者:  来源:互联网  浏览次数:10  文字大小:【】【】【
简介:<?php /** * ODBC to mySQL * 徐祖宁 (唠叨) * czjsz_ah@stats.gov.cn * * 初次接触php+mysql的朋友,有很多是ASP的高手。为使尽快上手 * 特写此程序,用于将原有的数据库通过ODBC数据源转换到mysql *...
关键字:mySQL ODBC to

/**

* 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

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。
";

echo "请检查命令是否正确。若不需要重新建表,请将下面的if(1) 改为if(0)
";

echo "不要改变表名,要增加字段请放在后面!";

echo "确认后重新运行本程序!";

odbc_close($odbc);

exit;

}

if(1) { // 若不需要重新建表,请将if(1) 改为if(0)

echo "开始建表...
";

$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
";

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 "
正在将数据从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

if($i > 0) $sql_query .= ",";

$sql_query .= "{$ar[$i]}{$rs[$i]}{$ar[$i]}";

}

$sql_query .= ")";

mysql_query($sql_query,$mysql);

}

}

odbc_close($odbc);

echo "
操作结束";

?>

责任编辑:admin
相关文章