首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用PHP同步两个数据库表?

如何使用PHP同步两个数据库表?
EN

Stack Overflow用户
提问于 2009-03-09 13:19:40
回答 8查看 26.8K关注 0票数 6

我需要使用PHP将数据从一个MySQL数据库复制到另一个数据库。

我可以构建所有值的数组,并将其放入另一个数据库中,但首先,我希望在插入之前确保数据库具有正确的字段。

例如,假设我要将数据从tableA复制到tableB。

我可以将tableB设置为看起来像tableA,但是将来我可能会向tableA添加列,而忘记将它们添加到tableB中,然后我的PHP脚本将尝试将数据插入到tableB中不存在的列中,这将失败。

所以我想要做的是比较tableA和tableB,以及tableA中tableB没有的任何列,将它们添加到tableB中。

有人能告诉我怎么做吗?

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2009-03-17 15:00:58

感谢大家,基于大家的帮助,我编写了一个PHP类,它可以将表A中的任何列复制到表B中:

代码语言:javascript
运行
复制
class MatchTable 
{
    var $_table_one_name;
    var $_table_two_name;

    var $_table_one_db_user;
    var $_table_one_db_pass;
    var $_table_one_db_host;
    var $_table_one_db_name;

    var $_table_two_db_user;
    var $_table_two_db_pass;
    var $_table_two_db_host;
    var $_table_two_db_name;

    var $_table_one_columns = array();
    var $_table_two_columns = array();
    var $_table_one_types = array();
    var $_table_two_types = array();

    var $_table_one_link;
    var $_table_two_link;

    var $_isTest;


    function MatchTable($isLive = true)
    {
        $this->_isTest = !$isLive;
    }

    function matchTables($table1, $table2)
    {
        $this->_table_one_name = $table1;
        $this->_table_two_name = $table2;

        if(isset($this->_table_one_db_pass))
        {
            $this->db_connect('ONE');
        }
        list($this->_table_one_columns,$this->_table_one_types) = $this->getColumns($this->_table_one_name);

        if(isset($this->_table_two_db_pass))
        {
            $this->db_connect('TWO');
        }
        list($this->_table_two_columns,$this->_table_two_types) = $this->getColumns($this->_table_two_name);

        $this->addAdditionalColumns($this->getAdditionalColumns());
    }

    function setTableOneConnection($host, $user, $pass, $name)
    {
        $this->_table_one_db_host = $host;
        $this->_table_one_db_user = $user;
        $this->_table_one_db_pass = $pass;
        $this->_table_one_db_name = $name;
    }

    function setTableTwoConnection($host, $user, $pass, $name)
    {
        $this->_table_two_db_host = $host;
        $this->_table_two_db_user = $user;
        $this->_table_two_db_pass = $pass;
        $this->_table_two_db_name = $name;
    }

    function db_connect($table)
    {
        switch(strtoupper($table))
        {
            case 'ONE':
                $host = $this->_table_one_db_host;
                $user = $this->_table_one_db_user;
                $pass = $this->_table_one_db_pass;
                $name = $this->_table_one_db_name;
                $link = $this->_table_one_link = mysql_connect($host, $user, $pass, true);
                mysql_select_db($name) or die(mysql_error());
            break;
            case 'TWO';
                $host = $this->_table_two_db_host;
                $user = $this->_table_two_db_user;
                $pass = $this->_table_two_db_pass;
                $name = $this->_table_two_db_name;
                $link = $this->_table_two_link = mysql_connect($host, $user, $pass, true);
                mysql_select_db($name) or die(mysql_error());
            break;
            default:
                die('Improper parameter in MatchTable->db_connect() expecting "one" or "two".');
            break;
        }
        if (!$link) {
            die('Could not connect: ' . mysql_error());
        }
    }

    function getColumns($table_name)
    {
        $columns = array();
        $types = array();
        $qry = 'SHOW COLUMNS FROM '.$table_name;
        $result = mysql_query($qry) or die(mysql_error());
        while($row = mysql_fetch_assoc($result))
        {
            $field = $row['Field'];
            $type = $row['Type'];
            /*
            $column = array('Field' => $field, 'Type' => $type);
            array_push($columns, $column);
            */
            $types[$field] = $type;
            array_push($columns, $field);
        }
        $arr = array($columns, $types);
        return $arr;
    }

    function getAdditionalColumns()
    {
        $additional = array_diff($this->_table_one_columns,$this->_table_two_columns);
        return $additional;
    }

    function addAdditionalColumns($additional)
    {
        $qry = '';
        foreach($additional as $field)
        {
            $qry = 'ALTER TABLE '.$this->_table_two_name.' ADD '.$field.' '.$this->_table_one_types[$field].'; ';

            if($this->_isTest)
            {
                echo $qry.'<br><br>';
            }
            else
            {
                mysql_query($qry) or die(mysql_error());
            }
        }
    }

    /**
     * End of Class
     */
}
票数 5
EN

Stack Overflow用户

发布于 2009-03-09 13:36:36

我不是百分之百确定这就是你要找的东西,但我以前做过一些数据库维护。我们需要一种方法来确保devDB和prodDB在结构上是相同的,于是我找到了这个漂亮的小工具。该工具创建一个sql-alter-script,可以在您想要修补的数据库上运行。它是用perl编写的,所以我猜它应该可以跨平台工作,但我只在linux上尝试过。

该工具名为mySQLdiff,是免费软件,可从www.mysqldiff.org下载。

票数 1
EN

Stack Overflow用户

发布于 2009-03-10 12:33:09

您可以查看一些为您做这件事的phpclasses,http://www.phpclasses.org/search.html?words=mysql+sync&x=0&y=0&go_search=1

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/626192

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档