0

我有一个来自一个 mysql db 的大表,我想在不同的 mysql db 中创建一个新表并从大表中复制 3 列。为此,我编写了以下代码:

$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)

我想我犯了一个小错误,但我无法抓住。

我应该如何解决这个问题?

谢谢

4

3 回答 3

2

您可以使用 MySQL在单个查询中执行此操作:

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

这消除了通过脚本往返值的需要。同样,您的代码容易受到 SQL 注入攻击。即使您直接从数据库中获取了这些数据,它仍然可以包含 sql 元字符,然后您会盲目地将其填充回另一个查询中。是的,完全可以自己注射。

于 2012-04-07T01:11:41.853 回答
1

你的数组 $result不是$resullts. 您声明了数组,然后在您使用的插入和插入中$results分配了值,该数组是空白的。$result$results

它应该是

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

顺便说一句,$j++ 其他任何地方都没有使用过的东西。

编辑:

正确引用 char 和 string 值:

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

在这里改变:

 $results[$j]= '("'.$result['col1'].'", "'.$result['col3'].'", "'.$result['col6'].'")';
于 2012-04-07T01:09:27.323 回答
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 并确保您正在转义并将其正确地传递回新的插入语句,MySQL 将为您从一个表到另一个表处理它。

但是,根据您上面的代码,可能存在来自破坏您查询的巨大表的非转义数据。“Array()”将来自您的 print_r 命令和来自下一个插入错误的错误。因此,您始终可以只打印您的 SQL 语句,而不是执行它并直接查看它。

于 2012-04-07T01:13:17.743 回答