Location: PHPKode > scripts > Admidio > admidio-2.2.9/adm_install/update.php
<?php
/******************************************************************************
 * Update der Admidio-Datenbank auf eine neue Version
 *
 * Copyright    : (c) 2004 - 2011 The Admidio Team
 * Homepage     : http://www.admidio.org
 * License      : GNU Public License 2 http://www.gnu.org/licenses/gpl-2.0.html
 *
 * Uebergaben: 
 *
 * mode     = 1 : (Default) Statuspruefung und Anzeige, ob ein Update notwendig ist
 *            2 : Update durchfuehren
 *            3 : Ergebnis des Updates ausgeben
 *
 *****************************************************************************/

require_once('install_functions.php');

// Uebergabevariablen pruefen

if(isset($_GET['mode']) && is_numeric($_GET['mode']))
{
    $req_mode = $_GET['mode'];
}
else
{
    $req_mode = 1;
}

// Konstanten und Konfigurationsdatei einbinden
require_once(substr(__FILE__, 0, strpos(__FILE__, 'adm_install')-1). '/config.php');
require_once(substr(__FILE__, 0, strpos(__FILE__, 'adm_install')-1). '/adm_program/system/constants.php');

 // Standard-Praefix ist adm auch wegen Kompatibilitaet zu alten Versionen
if(strlen($g_tbl_praefix) == 0)
{
    $g_tbl_praefix = 'adm';
}

// Default-DB-Type ist immer MySql
if(!isset($g_db_type))
{
    $g_db_type = 'mysql';
}

// PHP-Version pruefen und ggf. mit Hinweis abbrechen
if(version_compare(phpversion(), MIN_PHP_VERSION) == -1)
{
    die('<div style="color: #CC0000;">Error: Your PHP version '.phpversion().' does not fulfill 
		the minimum requirements for this Admidio version. You need at least PHP '.MIN_PHP_VERSION.' or more highly.</div>');
}

require_once(SERVER_PATH. '/adm_program/system/db/'. $g_db_type. '.php');
require_once(SERVER_PATH. '/adm_program/system/string.php');
require_once(SERVER_PATH. '/adm_program/system/function.php');
require_once(SERVER_PATH. '/adm_program/system/classes/datetime_extended.php');
require_once(SERVER_PATH. '/adm_program/system/classes/language.php');
require_once(SERVER_PATH. '/adm_program/system/classes/organization.php');

// Verbindung zu Datenbank herstellen
$g_db = new MySqlDB();
$g_adm_con = $g_db->connect($g_adm_srv, $g_adm_usr, $g_adm_pw, $g_adm_db);

// Daten der aktuellen Organisation einlesen
$g_current_organization = new Organization($g_db, $g_organization);

if($g_current_organization->getValue('org_id') == 0)
{
    // Organisation wurde nicht gefunden
    die('<div style="color: #CC0000;">Error: The organization of the config.php could not be found in the database!</div>');
}

// organisationsspezifische Einstellungen aus adm_preferences auslesen
$g_preferences = $g_current_organization->getPreferences();

// Sprachdateien einlesen
if(isset($g_preferences['system_language']) == false)
{
    $g_preferences['system_language'] = 'de';
}
$g_l10n = new Language($g_preferences['system_language']);

$message = '';

//Datenbank- und PHP-Version prüfen
if(checkVersions($g_db, $message) == false)
{
	showPage($message, $g_root_path.'/adm_program/index.php', 'application_view_list.png', $g_l10n->get('SYS_OVERVIEW'), 2);
}

if($req_mode == 1)
{
    // pruefen, ob ein Update ueberhaupt notwendig ist
    if(isset($g_preferences['db_version']) == false)
    {
        // bei einem Update von Admidio 1.x muss die spezielle Version noch erfragt werden,
        // da in Admidio 1.x die Version noch nicht in der DB gepflegt wurde
        $message = '<img style="vertical-align: top;" src="layout/warning.png" alt="'.$g_l10n->get('SYS_WARNING').'" />
                    <strong>'.$g_l10n->get('INS_DATABASE_NEEDS_UPDATED').'</strong><br /><br />
                    '.$g_l10n->get('INS_UPDATE_FROM_ADMIDIO_1X', ADMIDIO_VERSION).'<br /><br />
                    '.$g_l10n->get('INS_PREVIOUS_ADMIDIO_VERSION').':&nbsp;
                    <select id="old_version" name="old_version" size="1">
                        <option value="0" selected="selected">- '.$g_l10n->get('SYS_PLEASE_CHOOSE').' -</option>
                        <option value="1.4.9">Version 1.4.*</option>
                        <option value="1.3.9">Version 1.3.*</option>
                        <option value="1.2.9">Version 1.2.*</option>
                    </select>';
    }
    elseif(version_compare($g_preferences['db_version'], ADMIDIO_VERSION) != 0 || $g_preferences['db_version_beta'] != BETA_VERSION)
    {
        $message = '<img style="vertical-align: top;" src="layout/warning.png" alt="'.$g_l10n->get('SYS_WARNING').'" />
                    <strong>'.$g_l10n->get('INS_DATABASE_NEEDS_UPDATED').'</strong>';
    }
    else
    {
        $message = '<img style="vertical-align: top;" src="layout/ok.png" /> 
                    <strong>'.$g_l10n->get('INS_DATABASE_DOESNOT_NEED_UPDATED').'</strong><br /><br />
                    '.$g_l10n->get('INS_DATABASE_IS_UP_TO_DATE');
        showPage($message, $g_root_path.'/adm_program/index.php', 'application_view_list.png', $g_l10n->get('SYS_OVERVIEW'), 2);
    }

    // falls dies eine Betaversion ist, dann Hinweis ausgeben
    if(BETA_VERSION > 0)
    {
        $message .= '<br /><br />'.$g_l10n->get('INS_WARNING_BETA_VERSION');
    }
    showPage($message, 'update.php?mode=2', 'database_in.png', $g_l10n->get('INS_UPDATE_DATABASE'), 2);
}
elseif($req_mode == 2)
{
    // Updatescripte fuer die Datenbank verarbeiten
    
    if(isset($g_preferences['db_version']) == false)
    {
        if(isset($_POST['old_version']) == false 
        || strlen($_POST['old_version']) > 5
        || $_POST['old_version'] == 0)
        {
            showPage($g_l10n->get('SYS_FIELD_EMPTY', 'INS_PREVIOUS_ADMIDIO_VERSION'), 'update.php', 'back.png', $g_l10n->get('SYS_BACK'), 2);
        }
        $old_version = $_POST['old_version'];
    }
    else
    {
        $old_version = $g_preferences['db_version'];
    } 

    // setzt die Ausfuehrungszeit des Scripts auf 2 Min., da hier teilweise sehr viel gemacht wird
    // allerdings darf hier keine Fehlermeldung wg. dem safe_mode kommen
    @set_time_limit(300);

    // vor dem Update die Versionsnummer umsetzen, damit keiner mehr was machen kann
    $temp_version = substr(ADMIDIO_VERSION, 0, 4). 'u';
    $sql = 'UPDATE '. TBL_PREFERENCES. ' SET prf_value = "'. $temp_version. '"
             WHERE prf_name    = "db_version" ';
    $g_db->query($sql);                

    // erst einmal die evtl. neuen Orga-Einstellungen in DB schreiben
    include('db_scripts/preferences.php');

    $sql = 'SELECT * FROM '. TBL_ORGANIZATIONS;
    $result_orga = $g_db->query($sql);

    while($row_orga = $g_db->fetch_array($result_orga))
    {
        $g_current_organization->setValue('org_id', $row_orga['org_id']);
        $g_current_organization->setPreferences($orga_preferences, false);
    }

    $main_version      = substr($old_version, 0, 1);
    $sub_version       = substr($old_version, 2, 1);
    $micro_version     = substr($old_version, 4, 1);
    $micro_version     = $micro_version + 1;
    $flag_next_version = true;

    // Pruefungen auf Referenzen in anderen Tabellen beim Update ausschalten
    $sql = 'SET foreign_key_checks = 0 ';
    $g_db->query($sql);

    // nun in einer Schleife die Update-Scripte fuer alle Versionen zwischen der Alten und Neuen einspielen
    while($flag_next_version)
    {
        $flag_next_version = false;
        
        // in der Schleife wird geschaut ob es Scripte fuer eine Microversion (3.Versionsstelle) gibt
        // Microversion 0 sollte immer vorhanden sein, die anderen in den meisten Faellen nicht
        for($micro_version = $micro_version; $micro_version < 15; $micro_version++)
        {
            // Update-Datei der naechsten hoeheren Version ermitteln
            $sql_file  = 'db_scripts/upd_'. $main_version. '_'. $sub_version. '_'. $micro_version. '_db.sql';
            $conv_file = 'db_scripts/upd_'. $main_version. '_'. $sub_version. '_'. $micro_version. '_conv.php';                
            
            if(file_exists($sql_file))
            {
                // SQL-Script abarbeiten
                $file    = fopen($sql_file, 'r')
                           or showPage($g_l10n->get('INS_ERROR_OPEN_FILE', $sql_file), 'update.php', 'back.png', $g_l10n->get('SYS_BACK'));
                $content = fread($file, filesize($sql_file));
                $sql_arr = explode(';', $content);
                fclose($file);
    
                foreach($sql_arr as $sql)
                {
                    if(strlen(trim($sql)) > 0)
                    {
                        // Praefix fuer die Tabellen einsetzen und SQL-Statement ausfuehren
                        $sql = str_replace('%PREFIX%', $g_tbl_praefix, $sql);
                        $g_db->query($sql);
                    }
                }
                
                $flag_next_version = true;
            }
    
            if(file_exists($conv_file))
            {
                // Nun das PHP-Script abarbeiten
                include($conv_file);
                $flag_next_version = true;
            }
        }

        // keine Datei mit der Microversion gefunden, dann die Main- oder Subversion hochsetzen,
        // solange bis die aktuelle Versionsnummer erreicht wurde
        if($flag_next_version == false
        && version_compare($main_version. '.'. $sub_version. '.'. $micro_version , ADMIDIO_VERSION) == -1)
        {
            if($sub_version == 9)
            {
                $main_version  = $main_version + 1;
                $sub_version   = 0;
            }
            else
            {
                $sub_version   = $sub_version + 1;
            }
            
            $micro_version     = 0;
            $flag_next_version = true;
        }
    }

    // Pruefungen auf Referenzen in anderen Tabellen wieder aktivieren
    $sql = 'SET foreign_key_checks = 1 ';
    $g_db->query($sql);

    // nach dem Update erst einmal bei Sessions das neue Einlesen des Organisations- und Userobjekts erzwingen
    $sql = 'UPDATE '. TBL_SESSIONS. ' SET ses_renew = 1 ';
    $g_db->query($sql);
    
    // nach einem erfolgreichen Update noch die neue Versionsnummer in DB schreiben
    $sql = 'UPDATE '. TBL_PREFERENCES. ' SET prf_value = "'. ADMIDIO_VERSION. '"
             WHERE prf_name    = "db_version" ';
    $g_db->query($sql);                

    $sql = 'UPDATE '. TBL_PREFERENCES. ' SET prf_value = "'. BETA_VERSION. '"
             WHERE prf_name    = "db_version_beta" ';
    $g_db->query($sql);                
    
    // globale Objekte aus einer evtl. vorhandenen Session entfernen, 
    // damit diese nach dem Update neu eingelesen werden muessen
    
    // Cookie-Praefix ermitteln und Sonderzeichen entfernen
    $cookie_praefix = 'ADMIDIO_'. $g_organization;
    if($g_debug)
    {
        $cookie_praefix .= '_'. ADMIDIO_VERSION. '_'. BETA_VERSION;
    }
    $cookie_praefix = strtr($cookie_praefix, ' .,;:','_____');
    
    // PHP-Session starten und Variablen zuruecksetzen
    session_name($cookie_praefix. '_PHP_ID');
    session_start();
    unset($_SESSION['g_current_organisation'], $_SESSION['g_preferences'], $_SESSION['g_current_user']);

    // Hinweis, dass Update erfolgreich war
    $message = '<img style="vertical-align: top;" src="layout/ok.png" /> <strong>'.$g_l10n->get('INS_UPDATING_WAS_SUCCESSFUL').'</strong><br /><br />
               '.$g_l10n->get('INS_UPDATE_TO_VERSION_SUCCESSFUL', ADMIDIO_VERSION. BETA_VERSION_TEXT).'<br /><br />
               '.$g_l10n->get('INS_SUPPORT_FURTHER_DEVELOPMENT');
    showPage($message, 'http://www.admidio.org/index.php?page=donate', 'money.png', $g_l10n->get('SYS_DONATE'), 2);
}

?>
Return current item: Admidio