2012-03-14 247 views
1

我有一個特殊情況,我的客戶需要將ms訪問數據庫導入到他的mysql網站數據庫(所以它是一個遠程數據庫)。在Mysql數據庫中導入Microsoft Access數據庫

因爲託管計劃是共享主機(而不是vps),所以唯一的方法是通過PHP通過SQL查詢,因爲我沒有對託管的ODBC支持。

我現在的想法是這樣的一個(obviusly客戶端有MS-Windows操作系統):

  • 創建轉換MS-Access數據庫到書面上的文件很大的SQL查詢一個小C#應用程序
  • 然後
  • 該應用程序將使用FTP方式將文件發送到指定的目錄下的網站上
  • 一個PHP腳本,然後將定期運行(每30分鐘等),並檢查文件是否存在,最終將其導入到數據庫中

我知道這不是最好的方法,所以我提出了一個問題來爲這個問題創建一個不同的解決方法。客戶已經表示他想繼續使用他的ms訪問數據庫。

我遇到的最大問題是,腳本只能持續30秒,這顯然是導入數據的一個問題。

+0

我以前用過的類似過程。使用腳本將Access數據庫導出到有效的MySQL導入SQL文件並上傳到FTP站點,遠程服務器上的另一個腳本每晚運行一次,以查看該文件是否存在。如果是這樣,它會導入SQL文件(經過一些安全檢查) – 2012-03-14 18:39:43

+0

如何處理30秒的腳本執行限制?我不知道多少數據庫會大 – 2012-03-14 18:46:43

+0

http://php.net/manual/en/function.set-time-limit.php – horatio 2012-03-14 19:12:10

回答

1

要解決30秒的限制,請分解數據導入塊。這裏有一個大概的想法:

if(!file_exists('upload.sql')) exit(); 

$max = 2000; // the maximum number you want to execute. 

if(file_exists('progress.txt')) { 
    $progress = file_get_contents('progress.txt'); 
} else { 
    $progress = 0; 
} 

$file = file('upload.sql'); 

foreach($file as $current => $query) { 
    if($current < $progress) continue; // skip the ones we've done 
    if($current - $progress >= $max) break; // stop before we hit the max 
    mysql_query($query); 
} 

// did we finish the file? 
if($current == count($file) - 1) { 
    unlink('progress.txt'); 
    unlink('upload.sql'); 
} else { 
    file_put_contents('progress.txt', $current); 
} 
+0

是的,這是我想過的方法,但是我喜歡你在代碼中處理它的方式(特別是$ current <$ progress thing),我會在幾天內告訴你結果。 – 2012-03-14 21:24:13