0

1つの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");
    }

しかし、出力は次のとおりです。

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++ 他のどこでも使用されていないもの。

編集:

文字と文字列の値を適切に引用します。

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

ここで変更:

 $results[$j]= '("'.$result['col1'].'", "'.$result['col3'].'", "'.$result['col6'].'")';
于 2012-04-07T01:09:27.323 に答える
1

これを完全にMySQLステートメントで行う方が簡単で高速な場合があり、データベースが同じサーバー上にあり、資格情報が同じまたは承認されている場合は、2つの接続を使用する必要はありません。

例えば:-

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ステートメントを実行して直接確認するのではなく、いつでもSQLステートメントを出力することができます。

于 2012-04-07T01:13:17.743 に答える