2012-04-07 106 views
0

我有一個巨大的表從一個MySQL數據庫,我想創建一個新的表在不同的MySQL數據庫和從巨大的副本3列。要做到這一點,我寫了下面的代碼:使用implode創建新表

$result = mysql_query("SELECT * FROM huge_table", $hugeDB); 
    $count = mysql_result($result, 0); 
    $iterations=ceil($count/500);  

    for($i=1; $i<=$iterations; $i++) 
    { 
     $start = ($i-1)*500; 
     $query = mysql_query("SELECT col1, col3, col6 FROM huge_table LIMIT $i, 500", $hugeDB); 
     $results = array(); 
     $j = 0; 
     while($result = mysql_fetch_array($query)) { 
      $result[$j]= '('.$result['col1'].', '.$result['col3'].', '.$result['col6'].')'; 
      $j++; 
     } 
     print_r($results); 
     $a = mysql_query("INSERT INTO less_huge_table (col1, col3, col6) VALUES ".implode(',', $results), $localDB); 
     if(!$a) die(mysql_error()."\n"); 
    } 

但隨後的輸出是:

Unknown column 'BTFG' in 'field list' 

哪裏BTFG是數組的第一個元素的項目:

(2007-01-03, BTFG, 23.0481) 

我想我我犯了一個小錯誤,但我抓不住。

我應該如何解決這個問題?

感謝

回答

1

你的陣列是$result沒有$resullts。你用$results聲明數組,然後在$result中分配值,在插入時使用的是$results,這是空的。

應該

while($result = mysql_fetch_array($query)) { 
    $results[$j]= '("'.$result['col1'].'", "'.$result['col3'].'", "'.$result['col6'].'")'; 
    .... 
    } 

BTW什麼是不使用$j++其他地方。

編輯:

引號字符和字符串值正常:

('2007-01-03', 'BTFG', 23.0481) 

變化在這裏:

$results[$j]= '("'.$result['col1'].'", "'.$result['col3'].'", "'.$result['col6'].'")'; 
+0

你能看到我的編輯嗎? – CanCeylan 2012-04-07 01:24:19

+0

查看已更新回答 – 2012-04-07 01:33:16

+0

非常感謝! – CanCeylan 2012-04-07 01:44:40

2

您可以與MySQL做一個single query

INSERT INTO less_huge_table (col1, col3, col6) 
    SELECT col1, col3, col6 
    FROM huge_table 

這消除了通過腳本對值進行往返移動的需要。而且,您的代碼容易受到SQL注入攻擊。即使你直接從數據庫中獲取這些數據,它仍然可以包含sql元字符,然後你可以盲目地回填到另一個查詢中。是的,這是整個可能注入自己。

+0

但是,當我運行這個查詢哪個連接應該是活動?例如,如果localDB連接處於活動狀態,那麼我將無法訪問huge_table中的數據。 – CanCeylan 2012-04-07 01:21:46

+0

除非明確創建鎖,否則此查詢不會鎖定表。 – 2012-04-07 01:22:40

+0

但我應該連接哪個數據庫?如果我建立了一個到localDB的連接,當我說FROM from huge_table時,它表示表huge_table不存在 – CanCeylan 2012-04-07 01:25:42

1

它可能是更容易和更快地與一個MySQL聲明完全做到這一點,你不必使用兩個連接假設你的數據庫是在同一臺服務器上,並憑據是相同或授權。

例如: -

mysql_query('INSERT INTO less_huge_table (col1, col3, col6) SELECT col1, col3, col6 FROM huge_table LIMIT $i, 500', $hugeDB); 

如果你真的需要那麼跨到不同的服務器上的本地數據庫中的數據,就再次查詢系統,只有你less_huge_table。這使您不必讓你的信息到PHP,並確保您逃逸,其傳遞迴新的INSERT語句正確,MySQL會爲您處理它從桌到桌。

然而,根據您的代碼,它上面可能有非轉義的數據從打碎查詢巨大的表來。在「陣列()」將是從你的print_r的命令,並從下插入錯誤的錯誤。所以你總是可以打印你的SQL語句,而不是直接執行它並查看它。

+0

謝謝傑森,我是新來的。我會記住下次格式化。 – matthewnreid 2012-04-07 02:14:37