如何使用php将表格从一个网站复制到另一个网站?

如何使用php将表格从一个网站复制到另一个网站?,php,mysql,database,Php,Mysql,Database,我有两个网站,比如说-example.com和example1.com example.com有一个数据库,其中有一个包含7000条记录的apple表 我导出了苹果并试图将其导入example1.com,但我总是发现MYSQL服务器出现了错误。我怀疑这是由于某些服务器端限制 那么,如何在不联系系统管理员的情况下复制表呢?有没有一种方法可以使用PHP实现这一点?我介绍了复制表的示例,但这是在同一个数据库中 example.com和example1.com都在同一台服务器上 以下是MySQL 5.0

我有两个网站,比如说-example.com和example1.com

example.com有一个数据库,其中有一个包含7000条记录的apple表

我导出了苹果并试图将其导入example1.com,但我总是发现MYSQL服务器出现了错误。我怀疑这是由于某些服务器端限制

那么,如何在不联系系统管理员的情况下复制表呢?有没有一种方法可以使用PHP实现这一点?我介绍了复制表的示例,但这是在同一个数据库中


example.com和example1.com都在同一台服务器上

以下是MySQL 5.0中导致MySQL服务器消失错误的最常见原因:


您可能需要查看它,并将其用作检查表,以查看您是否做了错事。

以下是MySQL 5.0中导致MySQL服务器消失错误的最常见原因:

您可能想查看一下,并将其用作检查表,以查看您是否做了错事。

一种可能的方法:

在源服务器上创建一个PHP脚本,导出器以一种易于解析的格式输出表的内容。XML的生成和使用很容易,但CSV之类的替代方法也可以

在目标服务器上创建导入器PHP脚本,该脚本通过HTTP请求导出器PHP,解析结果,并使用该数据填充表

这很普通,但应该让你开始。以下是一些注意事项:

他是你的朋友吗 如果表中包含敏感数据,有许多技术可以增强安全性http_请求不会直接为您提供https://支持,但您可以加密导出的数据,并在导入时解密:有关详细信息,请参阅PHP手册中的SSL。 您应该考虑添加一些冗余,甚至是全容量加密,以防止数据在服务器之间运行Web时被篡改。 您可以使用GET参数来增加灵活性,例如,将表名作为参数传递将允许您为可能需要传输的所有表使用单个脚本。 对于大型表,PHP超时可能会对您不利。理想的解决方案是高效的代码+导出和导入脚本的自定义超时,但我甚至不确定这是否可行。一个相当可靠的解决方法是分块完成这项工作GET params在这里派上用场,告诉导出程序您需要什么块,并且输出上的一个特殊条目足以告诉导入程序还有多少要导入。重定向对这种方法有很大帮助。每个重定向都是一个新的请求,发送到服务器,因此超时会被重置。 也许我遗漏了什么,但我希望这足够让你在工作中弄脏你的双手,然后带着我可能无法预见的任何具体问题回来

希望这有帮助

编辑: 哎呀,我错过了两个数据库都在同一台服务器上的细节。在这种情况下,可以将导入和导出任务合并到单个脚本中。这意味着:

您不需要XML或CSV之类的传输格式:PHP中的内存表示就足够了,因为现在这两个任务都在同一个脚本中完成。 数据永远不会离开您的服务器,因此对加密的需求也不会太大。只要确保没有其他人可以通过身份验证或类似技术运行您的脚本,您就可以了。 超时没有那么严格,因为您不会浪费很多时间等待响应从源服务器到达目标服务器,但它们仍然适用。块处理、重定向和在重定向位置内传递的GET参数仍然是一个很好的解决方案,但是您可以将其压缩到更接近超时的位置,因为执行时间度量远比跨服务器数据传输度量可靠。 下面是您可能需要编写的代码的一个非常粗略的草图:

$link_src = mysql_connect(source DB connection details);
$link_dst = mysql_connect(destination DB connection details);
/* You may want to truncate the table on destination before going on, to prevent data repetition */
$q = "INSERT INTO `table_name_here` (column_list_here) VALUES ";
$res = mysql_query("SELECT * FROM `table_name_here`", $link_src);
while ($row = mysql_fetch_assoc($res)) {
    $q = $q . sprintf("(%s, %s, %s), ", $row['field1_name'], $row['field2_name'], $row['field3_name']);
}
mysql_free_result($res);
/* removing the trailing ',' from $q is left as an exercise (ok, I'm lazy, but that's supposed to be just a sketck) */
mysql_query($q, $link_dst);
您必须在其中添加分块逻辑,这些逻辑过于区分大小写和设置,可能会输出一些确认消息,可能是源表和目标表的描述和计数,以及它们之间的比较?,但这是工作的核心。 作为替代方案,您可以在循环中调用查询,每行运行一个单独的insert,但我相信单个查询会更快。但是,如果PHP的RAM限制太小,这个替代方案允许您摆脱内存不足的$q

还有一个编辑:

从Roberto发布的文档链接:

如果向服务器发送的查询不正确或太大,也会出现这些错误。如果mysqld接收到一个太大或无序的数据包,它会假定客户端出现了问题,并关闭连接。例如,如果需要大查询,如果正在处理大BLOB列,则可以通过设置服务器的max_allowed_packet变量来增加查询限制,该变量具有 默认值为1MB。您可能还需要增加客户端上的最大数据包大小。关于设置数据包大小的更多信息,请参见第B.5.2.10节“数据包过大”

插入大量行的INSERT或REPLACE语句也可能导致此类错误。这些语句中的任何一个都会向服务器发送一个请求,而与要插入的行数无关;因此,通常可以通过减少每次插入或替换发送的行数来避免错误

如果这就是导致问题的原因,并且您的问题看起来很可能是这样,那么将INSERT分解为每行一个查询的方法很可能会解决问题。在这种情况下,上面的代码草图变成:

$link_src = mysql_connect(source DB connection details);
$link_dst = mysql_connect(destination DB connection details);
/* You may want to truncate the table on destination before going on, to prevent data repetition */
$q = "INSERT INTO `table_name_here` (column_list_here) VALUES ";
$res = mysql_query("SELECT * FROM `table_name_here`", $link_src);
while ($row = mysql_fetch_assoc($res)) {
    $q = $q . sprintf("INSERT INTO `table_name_here` (`field1_name`, `field2_name`, `field3_name`) VALUE (%s, %s, %s)", $row['field1_name'], $row['field2_name'], $row['field3_name']);
}
mysql_free_result($res);
初始选择的巨大数量也可能引发该问题;在这种情况下,您应该将其与分块结合起来,或者使用多个SELECT+while块,利用SQL的LIMIT子句,或者通过重定向,从而将SELECT分解为多个更小的查询。请注意,只有当您有超时问题,或者您的执行时间足够接近超时,从而在表增长时可能出现问题时,才需要基于重定向的分块。无论如何,实现它可能是一个好主意,因此,即使您的表增长到了一个令人讨厌的大小,脚本仍将保持不变。

一种可能的方法:

在源服务器上创建一个PHP脚本,导出器以一种易于解析的格式输出表的内容。XML的生成和使用很容易,但CSV之类的替代方法也可以

在目标服务器上创建导入器PHP脚本,该脚本通过HTTP请求导出器PHP,解析结果,并使用该数据填充表

这很普通,但应该让你开始。以下是一些注意事项:

他是你的朋友吗 如果表中包含敏感数据,有许多技术可以增强安全性http_请求不会直接为您提供https://支持,但您可以加密导出的数据,并在导入时解密:有关详细信息,请参阅PHP手册中的SSL。 您应该考虑添加一些冗余,甚至是全容量加密,以防止数据在服务器之间运行Web时被篡改。 您可以使用GET参数来增加灵活性,例如,将表名作为参数传递将允许您为可能需要传输的所有表使用单个脚本。 对于大型表,PHP超时可能会对您不利。理想的解决方案是高效的代码+导出和导入脚本的自定义超时,但我甚至不确定这是否可行。一个相当可靠的解决方法是分块完成这项工作GET params在这里派上用场,告诉导出程序您需要什么块,并且输出上的一个特殊条目足以告诉导入程序还有多少要导入。重定向对这种方法有很大帮助。每个重定向都是一个新的请求,发送到服务器,因此超时会被重置。 也许我遗漏了什么,但我希望这足够让你在工作中弄脏你的双手,然后带着我可能无法预见的任何具体问题回来

希望这有帮助

编辑: 哎呀,我错过了两个数据库都在同一台服务器上的细节。在这种情况下,可以将导入和导出任务合并到单个脚本中。这意味着:

您不需要XML或CSV之类的传输格式:PHP中的内存表示就足够了,因为现在这两个任务都在同一个脚本中完成。 数据永远不会离开您的服务器,因此对加密的需求也不会太大。只要确保没有其他人可以通过身份验证或类似技术运行您的脚本,您就可以了。 超时没有那么严格,因为您不会浪费很多时间等待响应从源服务器到达目标服务器,但它们仍然适用。块处理、重定向和在重定向位置内传递的GET参数仍然是一个很好的解决方案,但是您可以将其压缩到更接近超时的位置,因为执行时间度量远比跨服务器数据传输度量可靠。 下面是您可能需要编写的代码的一个非常粗略的草图:

$link_src = mysql_connect(source DB connection details);
$link_dst = mysql_connect(destination DB connection details);
/* You may want to truncate the table on destination before going on, to prevent data repetition */
$q = "INSERT INTO `table_name_here` (column_list_here) VALUES ";
$res = mysql_query("SELECT * FROM `table_name_here`", $link_src);
while ($row = mysql_fetch_assoc($res)) {
    $q = $q . sprintf("(%s, %s, %s), ", $row['field1_name'], $row['field2_name'], $row['field3_name']);
}
mysql_free_result($res);
/* removing the trailing ',' from $q is left as an exercise (ok, I'm lazy, but that's supposed to be just a sketck) */
mysql_query($q, $link_dst);
您必须在其中添加分块逻辑,这些逻辑过于区分大小写和设置,可能会输出一些确认消息,可能是源表和目标表的描述和计数,以及它们之间的比较?,但这是工作的核心。 作为替代方案,您可以在循环中调用查询,每行运行一个单独的insert,但我相信单个查询会更快。但是,如果PHP的RAM限制太小,这个替代方案允许您摆脱内存不足的$q

还有一个编辑:

从Roberto发布的文档链接:

如果向服务器发送的查询不正确或太大,也会出现这些错误。如果mysqld接收到的数据包是t oo大型或无序,它假定客户端出现问题并关闭连接。如果您需要大查询,例如,如果您使用的是大BLOB列,则可以通过设置服务器的max_allowed_packet变量来增加查询限制,该变量的默认值为1MB。您可能还需要增加客户端上的最大数据包大小。关于设置数据包大小的更多信息,请参见第B.5.2.10节“数据包过大”

插入大量行的INSERT或REPLACE语句也可能导致此类错误。这些语句中的任何一个都会向服务器发送一个请求,而与要插入的行数无关;因此,通常可以通过减少每次插入或替换发送的行数来避免错误

如果这就是导致问题的原因,并且您的问题看起来很可能是这样,那么将INSERT分解为每行一个查询的方法很可能会解决问题。在这种情况下,上面的代码草图变成:

$link_src = mysql_connect(source DB connection details);
$link_dst = mysql_connect(destination DB connection details);
/* You may want to truncate the table on destination before going on, to prevent data repetition */
$q = "INSERT INTO `table_name_here` (column_list_here) VALUES ";
$res = mysql_query("SELECT * FROM `table_name_here`", $link_src);
while ($row = mysql_fetch_assoc($res)) {
    $q = $q . sprintf("INSERT INTO `table_name_here` (`field1_name`, `field2_name`, `field3_name`) VALUE (%s, %s, %s)", $row['field1_name'], $row['field2_name'], $row['field3_name']);
}
mysql_free_result($res);

初始选择的巨大数量也可能引发该问题;在这种情况下,您应该将其与分块结合起来,或者使用多个SELECT+while块,利用SQL的LIMIT子句,或者通过重定向,从而将SELECT分解为多个更小的查询。请注意,只有当您有超时问题,或者您的执行时间足够接近超时,从而在表增长时可能出现问题时,才需要基于重定向的分块。无论如何,实现它可能是一个好主意,因此,即使您的表增长到了一个令人讨厌的大小,脚本仍将保持不变。

经过一段时间的努力,终于找到了。它就像一个符咒!能够复制大型数据库而无故障

在挣扎了一段时间后,我遇到了。它就像一个符咒!能够复制大型数据库而无故障

您使用什么导出数据库?您是否具有服务器的SSH访问权限?您可以通过一个mySQL登录查看两个有问题的数据库吗?不,没有SSH访问权限。我用cPanel做所有事情。你用什么导出数据库?您是否具有服务器的SSH访问权限?您可以通过一个mySQL登录查看两个有问题的数据库吗?不,没有SSH访问权限。我用cPanel做所有事情。非常感谢你这么长的解释。BigDump-为我解决了这个问题。非常感谢您的详细解释。BigDump-为我解决了这个问题。