Php 使用内爆创建新表

Php 使用内爆创建新表,php,mysql,arrays,implode,Php,Mysql,Arrays,Implode,我从一个mysql数据库中得到了一个巨大的表,我想在不同的mysql数据库中创建一个新表,并从这个巨大的数据库中复制3列。为此,我编写了以下代码: $result = mysql_query("SELECT * FROM huge_table", $hugeDB); $count = mysql_result($result, 0); $iterations=ceil($count/500); for($i=1; $i<=$iterations; $i++

我从一个mysql数据库中得到了一个巨大的表,我想在不同的mysql数据库中创建一个新表,并从这个巨大的数据库中复制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");
    }
其中BTFG是数组的第一个元素项:

(2007-01-03, BTFG, 23.0481)
我想我犯了一个小错误,但我没能抓住

我应该如何解决这个问题


谢谢

您的数组是
$result
而不是
$results
。您使用
$results
声明了数组,然后在
$result
中赋值,在insert中使用的
$results
为空

应该是

  while($result = mysql_fetch_array($query)) {
   $results[$j]= '("'.$result['col1'].'", "'.$result['col3'].'", "'.$result['col6'].'")';
   ....
   }
顺便说一句,
$j++
没有在其他地方使用

编辑:

正确引用字符和字符串值:

('2007-01-03', 'BTFG', 23.0481)
在此处更改:

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

您的数组是
$result
而不是
$results
。您使用
$results
声明了数组,然后在
$result
中赋值,在insert中使用的
$results
为空

应该是

  while($result = mysql_fetch_array($query)) {
   $results[$j]= '("'.$result['col1'].'", "'.$result['col3'].'", "'.$result['col6'].'")';
   ....
   }
顺便说一句,
$j++
没有在其他地方使用

编辑:

正确引用字符和字符串值:

('2007-01-03', 'BTFG', 23.0481)
在此处更改:

 $results[$j]= '("'.$result['col1'].'", "'.$result['col3'].'", "'.$result['col6'].'")';
您可以使用MySQL在一个虚拟环境中完成此操作:

INSERT INTO less_huge_table (col1, col3, col6)
   SELECT col1, col3, col6
   FROM huge_table
这样就不需要通过脚本对值进行往返。此外,您的代码容易受到SQL注入攻击。即使您直接从数据库中获取了这些数据,它仍然可以包含sql元字符,然后盲目地将这些元字符塞回另一个查询中。是的,完全可以注入您自己。

您可以在MySQL中完成:

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

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

完全使用MySQL语句可能更容易、更快,并且假设您的数据库位于同一服务器上,并且凭据相同或经过授权,您不必使用两个连接

例如:

mysql_query( 'INSERT INTO less_huge_table (col1, col3, col6) SELECT col1, col3, col6 FROM huge_table LIMIT $i, 500', $hugeDB );
如果您确实需要这些数据,然后将其传输到另一台服务器上的本地数据库,只需再次查询系统中的较小的表即可。这可以防止您将信息输入PHP,并确保转义并正确地将其传递回新的insert语句,MySQL将为您从一个表处理到另一个表


但是,根据上面的代码,可能存在来自破坏查询的大型表的未转义数据。“Array()”将来自您的print\r命令,错误来自下一个insert错误。因此,您可以随时打印SQL语句,而不是直接执行并查看它。

完全使用MySQL语句可能更容易、更快地完成此操作,并且假设您的数据库位于同一服务器上,并且凭据相同或经过授权,则不必使用两个连接

例如:

mysql_query( 'INSERT INTO less_huge_table (col1, col3, col6) SELECT col1, col3, col6 FROM huge_table LIMIT $i, 500', $hugeDB );
如果您确实需要这些数据,然后将其传输到另一台服务器上的本地数据库,只需再次查询系统中的较小的表即可。这可以防止您将信息输入PHP,并确保转义并正确地将其传递回新的insert语句,MySQL将为您从一个表处理到另一个表


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

但是,当我运行此查询时,哪个连接应该处于活动状态?例如,如果localDB连接处于活动状态,那么我将无法访问大型_表中的数据。除非您显式创建锁,否则此查询不会锁定表。但是我应该连接哪个数据库?如果我连接到localDB,当我说FROM Hugh_table时,它说table Hugh_table不存在。您可以在查询中指定数据库来执行跨数据库查询:
INSERT INTO db1.less_Hugh。。。选择。。。从otherdb.maging_table…
可能我不知道或者我没有很好地解释情况,对于hugeDB,我用不同的用户名和密码连接不同的地址,对于localDB,我也有不同的地址和登录信息。因此,这些数据库不存储在同一个位置。我还能这样做吗?但是当我运行这个查询时,哪个连接应该是活动的?例如,如果localDB连接处于活动状态,那么我将无法访问大型_表中的数据。除非您显式创建锁,否则此查询不会锁定表。但是我应该连接哪个数据库?如果我连接到localDB,当我说FROM Hugh_table时,它说table Hugh_table不存在。您可以在查询中指定数据库来执行跨数据库查询:
INSERT INTO db1.less_Hugh。。。选择。。。从otherdb.maging_table…
可能我不知道或者我没有很好地解释情况,对于hugeDB,我用不同的用户名和密码连接不同的地址,对于localDB,我也有不同的地址和登录信息。因此,这些数据库不存储在同一个位置。我还能这么做吗?谢谢杰森,我是新来的。下次我会记得格式化。谢谢杰森,我是新来的。下次我会记得格式化的。