2012-04-07 83 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