2012-04-07 9 views
0

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

をしかし、その後、出力は次のようになります。

(2007-01-03, BTFG, 23.0481) 

私は「思う:BTFGは、配列の最初の要素の項目である

Unknown column 'BTFG' in 'field list' 

私は少し間違いを犯しましたが、私は捕まえられませんでした。

この問題をどのように解決すればよいですか?

おかげ

答えて

1

あなたの配列が$resultない$resulltsです。 $resultsで配列を宣言した後、$resultに値を割り当て、$resultsを空白にしているインサートに値を割り当てました。

それは$j++他の場所で使用されていないものをBTW

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

でなければなりません。

EDIT:

引用符文字と文字列値を適切:ここ

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

を変更:

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

私の編集をご覧ください。 – CanCeylan

+0

更新された回答を参照 –

+0

ありがとう! – CanCeylan

2

あなたは、MySQLとsingle queryでそれを行うことができます。

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

これにより、スクリプトを使用して値をラウンドトリップする必要がなくなります。同様に、あなたのコードはSQLインジェクション攻撃に対して脆弱です。このデータはデータベースから直接取得していますが、SQLメタキャラクタも含まれている可能性があります。その後、盲目的に別のクエリに取り戻します。はい、それはENTIRELYあなた自身を注射することが可能です。

+0

しかし、このクエリを実行しているうちに、どの接続をアクティブにする必要がありますか?たとえば、localDB接続がアクティブな場合、私はhuge_tableのデータにアクセスできません。 – CanCeylan

+0

このクエリは、ロックを明示的に作成しない限り、テーブルをロックしません。 –

+0

しかし、どのDBに接続すればよいですか?私がlocalDBに接続すると、FROM huge_tableと言うと、テーブルhuge_tableが存在しないと表示されます。 – CanCeylan

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ステートメントを印刷できます。

+0

ありがとうJason、私はここで新しいです。私は次回にフォーマットすることを覚えています。 – matthewnreid