ich habe das mal auf localhost mit einer V 2.0.18 versucht.
Code: Alles auswählen
<?
$dbms = 'mysql';
$phpbb_root_path = '../phpBB/';
$dbhost = 'localhost';
$dbuser = 'user';
$dbpasswd = 'secret';
// Name and prefix for the database that should keep the original IDs
$dbname1 = 'database1';
$table_prefix1 = '';
// Name and prefix for the database that is going to be added
// to DB1.
$dbname2 = 'database2';
$table_prefix2 = 'phpbb_';
define('IN_PHPBB', true);
// Use DB1 for the initial config table etc.
$dbname = $dbname1;
$table_prefix = $table_prefix1;
include($phpbb_root_path . 'extension.inc');
include($phpbb_root_path . 'includes/constants.'.$phpEx);
include($phpbb_root_path . 'includes/db.'.$phpEx);
// These tables can be dropped from DB2 (not used in this script)
$drop_tables = array(
"config",
"banlist", // This one could be converted
"disallow",
"search_results",
"search_wordlist",
"search_wordmatch",
"sessions",
"smilies",
"themes",
"themes_name",
"words"
);
// All tables in DB2 that should shift ID.
// - table that needs shifting (categories)
// - id in table (cat_id)
// nested array:
// - table that depends on id (forums)
// - id that corresponds to id in original table (cat_id)
$shift_tables = array(
"categories" => array(
"cat_id",
array(
array("forums", "cat_id")
)
),
"forums" => array(
"forum_id",
array(
array("posts", "forum_id"),
array("topics", "forum_id"),
array("forum_prune", "forum_id"),
array("auth_access", "forum_id")
)
),
"forum_prune" => array(
"prune_id",
array()
),
"groups" => array(
"group_id",
array(
array("user_group", "group_id"),
array("auth_access", "group_id")
)
),
"posts" => array(
"post_id",
array(
array("posts_text", "post_id"),
array("topics", "topic_first_post_id"),
array("topics", "topic_last_post_id")
)
),
"privmsgs" => array(
"privmsgs_id",
array(
array("privmsgs_text", "privmsgs_text_id"),
array("users", "user_last_privmsg")
)
),
"topics" => array(
"topic_id",
array(
array("posts", "topic_id"),
array("topics_watch", "topic_id"),
array("vote_desc", "topic_id")
)
),
"users" => array(
"user_id",
array(
array("user_group", "user_id"),
array("groups", "group_moderator"),
array("posts", "poster_id"),
array("topics", "topic_poster"),
array("privmsgs", "privmsgs_to_userid"),
array("privmsgs", "privmsgs_from_userid"),
array("topics_watch", "user_id"),
array("vote_voters", "vote_user_id")
)
),
"ranks" => array(
"rank_id",
array(
array("users", "user_rank")
)
),
"vote_desc" => array(
"vote_id",
array(
array("vote_voters", "vote_id"),
array("vote_results", "vote_id")
)
)
);
$bla_tables = array(
"auth_access",
"user_group",
"posts_text",
"privmsgs_text",
"topics_watch",
"vote_results",
"vote_voters"
);
// Traverse the shift_tables array
foreach($shift_tables as $key => $value)
{
$table = $key;
$merge_tables[$table] = 0; // keep an array with all tables that need merging
$column = $value[0]; // Column with ID that needs to be shifted
$ref = $value[1]; // Tables that are using the mentioned ID.
print "Shifting IDs in table $table<br />\n";
$max = shift_ids($table, $column);
flush();
// Do the dependent tables
foreach($ref as $key => $value)
{
$d_table = $value[0];
$merge_tables[$d_table] = 0;
$d_column = $value[1];
print " Altering dependent table: $d_table : $d_column (offset = $max)<br />\n";
flush();
shift_ids($d_table, $d_column, $max);
}
print "<br />\n";
flush();
}
foreach($merge_tables as $table => $value)
{
print "Merging $table table: ";
if(merge_tables($table_prefix1 . $table))
{
print " OK<br />\n";
}
else
{
print " FAILED!<br />\n";
}
}
print "Merging users (username and either password or email are the same).<br />";
$sql = "
SELECT
u1.user_id as id1,
u2.user_id as id2,
u1.username
FROM
" . USERS_TABLE . " u1,
" . USERS_TABLE . " u2
WHERE
u1.username = u2.username
&& (u1.user_password = u2.user_password
|| u1.user_email = u2.user_email)
&& u1.user_id != u2.user_id
&& u1.user_id < u2.user_id";
if(!$result = $db->sql_query($sql))
{
message_die(GENERAL_ERROR, 'Could not query for double user records.', '', __LINE__, __FILE__, $sql);
}
print "<table cellpadding='0' cellspacing='0'>";
while($row = $db->sql_fetchrow($result))
{
print "<tr><td> ".$row['id1']." </td><td> ".$row['id2']." </td><td> ".$row['username']." </td><td> ";
merge_users($row['id1'], $row['id2']);
print " </td></tr>\n";
}
print "</table>";
function merge_users($user_id1, $user_id2)
{
global $db;
global $shift_tables;
global $table_prefix1;
$user_deps = $shift_tables['users'][1];
// The users table should be skipped and the user_posts column should be updated.
foreach($user_deps as $key => $value)
{
$d_table = $value[0];
$d_column = $value[1];
$sql = "UPDATE $table_prefix1$d_table SET $d_column = $user_id1 WHERE $d_column = $user_id2";
if(!$result = $db->sql_query($sql))
{
message_die(GENERAL_ERROR, 'Could not update user_id.', '', __LINE__, __FILE__, $sql);
}
}
$sql = "DELETE FROM " . $table_prefix1 . "users WHERE user_id = $user_id2";
if(!$result = $db->sql_query($sql))
{
message_die(GENERAL_ERROR, 'Could not delete user2.', '', __LINE__, __FILE__, $sql);
}
print "OK";
return;
}
function double_users()
{
global $db;
global $table_prefix1;
$users_table = $table_prefix1 . "users";
$sql = "SELECT user_id, ";
}
function merge_tables($table)
{
global $db;
global $dbname1, $table_prefix1, $dbname2, $table_prefix2;
$sql = "SHOW FIELDS FROM $table_prefix$table";
if(!$result = $db->sql_query($sql))
{
message_die(GENERAL_ERROR, 'Could not get field info from $table.', '', __LINE__, __FILE__, $sql);
}
$fields = array();
while($row = $db->sql_fetchrow($result))
{
$fields[] = $row['Field'];
}
$fieldlist = implode($fields, ', ');
if($table == 'users')
{
$where = " WHERE $dbname2.$table_prefix2" . $table . ".user_id > 0";
}
else
{
$where = '';
}
$sql = "INSERT INTO $dbname1.$table_prefix1".$table." ($fieldlist) SELECT $fieldlist from $dbname2.$table_prefix2" . $table . $where;
if(!$db->sql_query($sql))
{
message_die(GENERAL_ERROR, 'Could not merge $table.', '', __LINE__, __FILE__, $sql);
}
return TRUE;
}
// Shift all ID's in column $id in table $table in
// database 2 by MAX($id) or (if not 0) by $offset
function shift_ids($table, $id, $offset = 0)
{
global $db;
global $dbname1, $table_prefix1;
global $dbname2, $table_prefix2;
// Offset hasn't been given, we're going to figure it out ourselfs
if($offset == 0)
{
if(!$offset = getmax($dbname1, $table_prefix1.$table, $id))
{
// Empty table, no need to shift IDs
print "Empty table? Skipping...<br />\n";
return;
}
}
// What's the max_id in the current table?
$max2 = getmax($dbname2, $table_prefix2.$table, $id);
$max2 = intval($max2); // Make sure that max2 contains a number, make it 0 if this table is empty.
// First we add the offset + the max of the current table
// Treat values of 0 and lower as special values.
$sql = "UPDATE $dbname2." . $table_prefix2 . $table . " SET $id = $id + $max2 + $offset WHERE $id > 0";
print "$sql<br />\n";
if(!$result = $db->sql_query($sql) )
{
message_die(GENERAL_ERROR, 'Could not fetch max(id).', '', __LINE__, __FILE__, $sql);
}
// Then we subtract the max of the current table again.
// We do this to prevent problems with key constrains from happening
// i.e. if we do id=id+20 on key 1 when key 21 already exists we would get an error
$sql = "UPDATE $dbname2." . $table_prefix2 . $table . " SET $id = $id - $max2 WHERE $id > 0";
print "$sql<br />\n";
if(!$result = $db->sql_query($sql) )
{
message_die(GENERAL_ERROR, 'Could not fetch max(id).', '', __LINE__, __FILE__, $sql);
}
return $offset;
}
function getmax($dbname, $table, $id)
{
global $db;
$sql = "SELECT MAX($id) as max_id FROM $dbname." . $table;
if(!$result = $db->sql_query($sql) )
{
message_die(GENERAL_ERROR, 'Could not fetch max(id).', '', __LINE__, __FILE__, $sql);
}
if($max = $db->sql_fetchrow($result))
{
return($max['max_id']);
}
else
{
// Probably no rows where returned.. Empty table.
return FALSE;
}
}
function message_die($msg_code, $msg_text = '', $msg_title = '', $err_line = '', $err_file = '', $sql = '')
{
global $db, $template, $board_config, $theme, $lang, $phpEx, $phpbb_root_path, $nav_links, $gen_simple_header;
global $userdata, $user_ip, $session_length;
global $starttime;
$sql_store = $sql;
//
// Get SQL error if we are debugging. Do this as soon as possible to prevent
// subsequent queries from overwriting the status of sql_error()
//
$sql_error = $db->sql_error();
$debug_text = '';
if ( $sql_error['message'] != '' )
{
$debug_text .= '<br /><br />SQL Error : ' . $sql_error['code'] . ' ' . $sql_error['message'];
}
if ( $sql_store != '' )
{
$debug_text .= "<br /><br />$sql_store";
}
if ( $err_line != '' && $err_file != '' )
{
$debug_text .= '</br /><br />Line : ' . $err_line . '<br />File : ' . $err_file;
}
print $debug_text;
exit;
}
?>