*Hello**

This has been a question for a long time / Request for help for a PHP script.

A year ago I created a homepage for a friend (online tutoring website) and installed a finished script for an occupancy calendar and did not consider / knew that the server will soon be switching to PHP 7.2. I could already test and adjust the rest of the homepage, but unfortunately I am with my Latin at the end and of course the calendar does not work.

The problem is of course the database connection .... mysq under PHP 7.2, which I get not fixed

My question:

Can someone take a look at the code and tell them to adapt and / or have tips for me? I would like to understand where the dog is buried and change it myself, but without help, I'm just not coming.

Furthermore, the whole covers about 19 pages and if I post all here, it's probably confusing. I would send the package by email if I get help.

<?php

// Kalender Version
define ('VERSION', '2.1.4');

// PHP version
$php_version_required = '5.0.0';
$php_version_current = phpversion ();
if (version_compare ($php_version_current, $php_version_required, '<')) {
die ('ERROR: PHP version ' . $php_version_required . ' or later required! You have installed ' . $php_version_current . '.');
}

// Session
session_start ();

// Includes
require_once BASEDIR . 'includes/db.class.php';
require_once BASEDIR . 'includes/cal.class.php';
require_once BASEDIR . 'includes/functions.inc.php';
require_once BASEDIR . 'includes/config.inc.php';

// Variables
$r = ''; // Output buffer
$pageTitle = '';
$lang = '';
$langFromUser = false;

// PHP runtime settings
if (DEBUG) {
ini_set ('display_errors', 1);
error_reporting (E_ALL);
}
else {
ini_set ('display_errors', 0);
}

// Language part 1: before db connection
// If language is stored in GET or SESSION, use this
if (isset ($_GET['lang']))
$lang = $_GET['lang'];
elseif (isset ($_SESSION['lang']))
$lang = $_SESSION['lang'];
// Validate or use de as default
$lang = preg_replace ('/[^a-z_]*/', '', $lang);
$langFile = BASEDIR . 'lang/' . $lang . '.inc.php';
if (file_exists ($langFile))
$langFromUser = true;
else {
$lang = 'de';
$langFile = BASEDIR . 'lang/' . $lang . '.inc.php';
}
if (file_exists ($langFile)) {
require_once $langFile; // Include
$_SESSION['lang'] = $lang; // Store in SESSION
}
else
trigger_error ('Language file "' . $langFile . '" not found.', E_USER_ERROR);

// Connect to db and check for errors
$db = new DatabaseConnection ($mysql);
if ($db -> error) {
$pageTitle = __('error');
switch ($db -> error) {
    case 1:
        $r .= echoError (__('errorDBAuth'));
        break;
    case 2:
        $r .= echoError (__('errorDBSetupNoDB'));
        break;
    case 3:
        $r .= echoError (__('errorDBSetupNoTables'));
        break;
    case 4:
    case 5:
        $r .= echoError (__('errorDBSetupVersionsDiffer'));
    }
    }

// Jobs to do if successfull connected
else {
// Read preferences
$prefs = readPrefs ($db);
// Language part 2: use default language from db, if hard-coded default chosen in part 1
if (!$langFromUser) {
    $result = $db -> select ("SELECT `abbr` FROM `languages` WHERE `id`=" . $prefs['languageDefault']);
    $langFile = BASEDIR . 'lang/' . $result[0]['abbr'] . '.inc.php';
    if (file_exists ($langFile)) {
        $lang = $result[0]['abbr'];
        require_once $langFile; // Include
        $_SESSION['lang'] = $lang; // Store in SESSION
    }
}
// Get language id
$result = $db -> select ("SELECT `id` FROM `languages` WHERE `abbr`='" . $lang . "'");
define ('LANG_ID', $result[0]['id']);
// Get active languages
$GLOBALS['langsActive'] = readLanguages ();
}
// Define Language
define ('LANG_ABBR', $lang);

that the "i" is not enough, is clear and I could also apply to the rest of the HP I've made myself.

the 34 pages or * .php files are the whole construct of this occupancy calendar incl. admin area and first installation tool (which is really needed for website)

not every * .php also contains database-relevant scripts

but attached a few snippets of code to see had approximately running

public    $error = false;
public    $version = false;
private    $link = false;
private $config = array ();

/**
 * Wrapper for connect ()
 * @param    $db        Array with vars from config
 * @return            result from connect ()
 */
public function databaseConnection ($mysql) {
    $this -> config = $mysql;
    return $this -> connect ();
}

/**
 * Tries to connect to db and checks installation.
 * @return            true if no error, else false
 */
public function connect () {
    // Reset $error
    $this -> error = false;
    // Try to connect to db
    $this -> link = @mysql_connect ($this -> config['host'] . ':' . $this -> config['port'], $this -> config['user'], $this -> config['pass']);
    if (!$this -> link)
        $this -> error = 1; // Connection failed.
    else {
        if (function_exists ('mysql_set_charset'))
            mysql_set_charset ('utf8', $this -> link);
        // Try to select db
        if (mysql_select_db ($this -> config['name'], $this -> link)) {
            // Look for prefs table
            $version = $this -> select ("SELECT `value` FROM `prefs` WHERE `name`='dbVersion'");
            if (!$version) {
                // Check for v1.x installation with this year's table
                $tables = $this -> select ("SHOW TABLES");
                if ($tables) {
                    foreach ($tables as $table) {
                        if (in_array ($this -> config['pfix'] . date ('Y'), $table)) {
                            $this -> error = 5; // v1.x installation found
                            break;
                        }
                    }
                }
                if (!$this -> error)
                    $this -> error = 3; // Table does not exist
            }
            // Check for db version
            else {
                $this -> version = $version[0]['value'];
                if ($this -> version != VERSION)
                    $this -> error = 4; // DB-Version and Files-Version differ
            }
        }
        else
            $this -> error = 2; // Database does not exist
    }
    if ($this -> error)
        return false;
    else
        return true;
}`

Dani AI

Generated

This thread already has the right diagnosis: the site uses the removed ext/mysql API, so it must be migrated to either mysqli or PDO. As pointed out, the pragmatic, low-risk path for ’s calendar is to rewrite the DatabaseConnection internals and keep its public API (so the 19 pages need few or no edits). That preserves the existing select()/error-code behavior while swapping the engine under the hood.

A compact migration plan:

  • Replace the connection routine with mysqli (or PDO) and pass host and port separately (do not concatenate "host:port"). Call set_charset('utf8') on the new link.
  • Re-implement select() to run queries on the mysqli link and return an array of associative arrays (so existing code expecting $result[0]['id'] keeps working).
  • Replace escaping calls (mysql_real_escape_string) with $mysqli->real_escape_string() or, better, use prepared statements for user input.
  • Map connection/query failures to the same numeric error codes the app currently checks (1..5) so the UI and installer logic keep working.
  • Test locally on PHP 7.2+ with mysqli/pdo_mysql enabled before deploying.

Example minimal connect replacement (illustrative only):

public function connect() {
    $cfg = $this->config;
    $mysqli = new mysqli($cfg['host'], $cfg['user'], $cfg['pass'], $cfg['name'], (int)$cfg['port']);
    if ($mysqli->connect_errno) { $this->error = 1; return false; }
    $mysqli->set_charset('utf8');
    $this->link = $mysqli;
    return true;
}

Troubleshooting notes: enable PHP error logging and check phpinfo to confirm mysqli/pdomysql is installed; search the codebase for all `mysql*` usages and replace them; prefer PDO for long-term portability and prepared statements. A compatibility shim can be used short-term, but a direct mysqli/PDO rewrite is safer and future-proof.

Be a part of the DaniWeb community

We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, networking, learning, and sharing knowledge.