1

MySQLをデータベースサーバーとして使用しているPHP Webアプリケーションを作成しています。あるデータベースから別のデータベースにいくつかのテーブルのバックアップを作成したい(そのテーブルを含む)。2 つの異なる接続を作成しましたが、テーブルが更新されません。

$dbcon1 = mysql_connect(DB_SERVER,DB_USER,DB_PASSWORD) or die(mysql_error());
$dbase1 = mysql_select_db(TEMP_DB_NAME,$dbcon)or die(mysql_error());

$query1=mysql_query("SELECT * FROM emp");

while($row = mysql_fetch_array($query1, MYSQL_NUM))
{
    $dbcon2 = mysql_connect(DB_SERVER,DB_USER,DB_PASSWORD) or die(mysql_error());
    $dbase2 = mysql_select_db(TEMP_DB_NAME2,$dbcon)or die(mysql_error());

    mysql_query("INSERT INTO backup_emp VALUES(null,'$row[1]',$row[2])");
    mysql_close($dbcon2);
}

上記のコードは、最初のデータベースから emp のデータを取得し、それを別のデータベースの別の backup_emp テーブルに更新しています。コードが正しく動作していません。これを行う他の方法はありますか...助けてください。

4

6 に答える 6

6

まず第一に、潜在的に何百もの接続を開き、クエリを実行してそれらを閉じ、それらを再度開くだけです。

2 番目の connect ステートメントをループから外します。

次に、どのコマンドがどの接続を対象としているかを PHP に伝える必要があります。たとえば、次のようになります。

$query1 = mysql_query("SELECT * FROM emp", $dbcon1);

while($row = mysql_fetch_array($query1, MYSQL_NUM))
{
    mysql_query("INSERT INTO backup_emp VALUES(null,'$row[1]',$row[2])", $dbcon2);
}

最後にちょっとしたことがあります: 両方の接続が同じユーザー名と同じパスワードで同じサーバーに行く場合、2 つの mysql_connect ステートメントは同じ接続 ID で終わります。

そのため、2 番目の connect ステートメントの 4 番目のステートメント (新しいリンク) を true に設定する必要があります。

$dbcon2 = mysql_connect(DB_SERVER, DB_USER, DB_PASSWORD, true)
于 2010-04-23T05:29:04.010 に答える
5

両方のデータベースが同じサーバー上にあり、テーブルのスキーマが同じである場合は、代わりに次のクエリを使用する必要があります。

mysql_query("INSERT INTO database2.backup_emp SELECT * FROM database1.emp");

これにより、複数のデータベース接続について心配する必要がなくなります。

于 2010-04-23T05:32:26.327 に答える
1

なぜそんなに多くの接続が必要なのですか。それは物事をより複雑にします

于 2010-04-23T07:23:09.283 に答える
1
INSERT INTO db2.table SELECT * FROM db1.table
于 2010-04-23T05:32:04.720 に答える
1

あなたがすべき:

  • 提案されているように、ループの外側に 2 番目の DB の接続線を配置します。
  • select db ステートメントで dbcon1 または 2 を指定する必要があります
  • 2 番目の接続要求の最後のパラメーターとして true を追加します。
  • 挿入する前に値をテストしてください (PHP では行インデックスが 1 ではなく 0 から始まることを忘れないでください)。

おそらく次のように動作します:

$dbcon1 = mysql_connect(DB_SERVER,DB_USER,DB_PASSWORD) or die(mysql_error());
$dbase1 = mysql_select_db(TEMP_DB_NAME,$dbcon1) or die(mysql_error());
$dbcon2 = mysql_connect(DB_SERVER,DB_USER,DB_PASSWORD,true) or die(mysql_error());
$dbase2 = mysql_select_db(TEMP_DB_NAME2,$dbcon2) or die(mysql_error());
$errors= array();

$query1= mysql_query("SELECT * FROM emp");

while($row = mysql_fetch_array($query1, MYSQL_NUM))
{
   if (!isset($row[1])) 
      $row[1]= 'null'; //or generates an error
   else
      $row[1]= "'".$row[1]."'";
   if (!isset($row[2])) $row[2]= 'null'; //or generates an error
   if (mysql_query("INSERT INTO backup_emp VALUES(null,".$row[1].",".$row[2].")") !== true)
      $errors[]= "Problem inserting values (".$row[1].",".$row[2].").");
}
mysql_free_result($query1);
mysql_close($dbcon1);
mysql_close($dbcon2);

ただし、データに対して追加の計算、チェック、またはその他の処理を行う必要がない場合は、次の提案も有効です。

INSERT INTO db2.table SELECT * FROM db1.table

それが役に立てば幸い

C^

于 2010-04-23T07:42:15.563 に答える
0

必要なのは、ur コードの行を変更することだけです。

$dbcon2 = mysql_connect(DB_SERVER,DB_USER,DB_PASSWORD, true ) または die(mysql_error());

$dbcon1 = mysql_connect(DB_SERVER,DB_USER,DB_PASSWORD) or die(mysql_error());
$dbase1 = mysql_select_db(TEMP_DB_NAME,$dbcon)or die(mysql_error());

$query1=mysql_query("SELECT * FROM emp");

while($row = mysql_fetch_array($query1, MYSQL_NUM))
{
    $dbcon2 = mysql_connect(DB_SERVER,DB_USER,DB_PASSWORD,true) or die(mysql_error());
    $dbase2 = mysql_select_db(TEMP_DB_NAME2,$dbcon)or die(mysql_error());

    mysql_query("INSERT INTO backup_emp VALUES(null,'$row[1]',$row[2])");
    mysql_close($dbcon2);
}
于 2010-04-23T06:50:46.120 に答える