1

我正在制作一个 PHP Web 应用程序,其中我使用 MySQL 作为数据库服务器,我想将一些表从一个数据库备份到另一个数据库(其中包含该表)。我创建了两个不同的连接,但表没有更新。

$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

首先:您可能会打开数百个连接,运行查询并关闭它们,只是为了再次重新打开它们。

将第二个连接语句从循环中取出。

其次,您必须告诉 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);
}

还有最后一点:如果两个连接使用相同的用户名和相同的密码访问同一服务器,则两个 mysql_connect 语句将以相同的连接 ID 结束。

这就是为什么您需要将第二个连接语句中的第四个语句(新链接)设置为 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
INSERT INTO db2.table SELECT * FROM db1.table
于 2010-04-23T05:32:04.720 回答
1

为什么需要这么多连接。这让事情变得更复杂

于 2010-04-23T07:23:09.283 回答
1

你应该:

  • 按照建议将第二个数据库的连接线放在循环之外
  • 您必须在 select db 语句中指定 dbcon1 或 2
  • 将 true 作为最后一个参数添加到第二个连接请求
  • 在插入它们之前测试您的值(不要忘记行索引在 PHP 中从零开始,而不是 1)。

可能像这样工作:

$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

您只需要在您的代码中更改一行:

$dbcon2 = mysql_connect(DB_SERVER,DB_USER,DB_PASSWORD, true ) 或死(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 回答