ODBC to mySQL

來源:互聯網
上載者:User
mysql|odbc <?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>操作結束";
?>


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.