gpt4 book ai didi

php - 如何用 PHP 同步两个数据库表?

转载 作者:可可西里 更新时间:2023-11-01 07:50:46 25 4
gpt4 key购买 nike

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

我可以构建所有值的数组以进入另一个数据库,但首先我想确保数据库在插入之前具有正确的字段。

例如,假设我要将数据从表 A 复制到表 B。

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

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

谁能告诉我怎么做?

最佳答案

谢谢大家,在你们的帮助下,我能够编写一个 PHP 类,将表 A 中的任何列复制到表 B,如果它们还不存在的话:

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
*/
}

关于php - 如何用 PHP 同步两个数据库表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/626192/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com