Я прочитал здесь почти все ссылки по этой теме. Моя личная проблема в том, что у меня есть OOP CMS, которая была написана с использованием давно устаревшего доступа к базе данных mysql. Теперь моя задача - обновить все с PHP 5.6 до PHP 7.x. Выбор был либо PDO, либо mysqli, и я выбрал последнее, поскольку его синтаксис приближается к моему чтению и пониманию кода.

Вот мой код mysql :

Учетные данные определены в DBSettings.php :

    <?php
        // Variablen fuer den Datenbankzugriff
        $DATABASESERVER   = 'localhost';
        $DATABASENAME     = 'whatever_db';
        $DATABASEUSERNAME = 'blithering_idiot';
        $DATABASEPASSWORD = 'moronic_fool_1234_$%&/';
        $DATABASETYPE     = 'MySQL';

        //require_once($_SERVER['DOCUMENT_ROOT'].'/DBSettings.inc.php');
    ?>

Файл с именем PHP5_classDatabase.php содержит класс:

    <?php
        error_reporting(-1);
        //ini_set('display_errors', 'On');

        class database extends object
        {
            private $rConnection;
            private $sDatabaseType;
            private $sDatabaseServer;
            private $sDatabaseName;
            private $sUserName;
            private $sPassword;

            public function __construct($sDatabaseServer, $sUserName, $sPassword, $sDatabaseType = 'MySQL')
            {
                switch ($sDatabaseType) {
                    case 'MySQL':
                        $this->setConnection(mysqli_connect($sDatabaseServer, $sUserName, $sPassword));
                        $this->setDatabaseType($sDatabaseType);
                    break;
                    case 'MSSQL':
                        $this->setConnection(mssql_connect($sDatabaseServer, $sUserName, $sPassword));
                        $this->setDatabaseType($sDatabaseType);
                    break;
                    default:
                        $this->setConnection(mysqli_connect($sDatabaseServer, $sUserName, $sPassword));
                    $this->setDatabaseType('MySQL');
                }
                $this->setDatabaseServer($sDatabaseServer);
                $this->setUserName($sUserName);
                $this->setPassword($sPassword);
                $this->setDatabaseName('');
            }

            public function setConnection($rConnection)
            {
                $this->rConnection = $rConnection;
            }

            public function setDatabaseType($sDatabaseType)
            {
                $this->sDatabaseType = $sDatabaseType;
            }

            public function setDatabaseServer($sDatabaseServer)
            {
                $this->sDatabaseServer = $sDatabaseServer;
            }

            public function setDatabaseName($sDatabaseName)
            {
                $this->sDatabaseName = $sDatabaseName;
            }

            public function setUserName($sUserName)
            {
                $this->sUserName = $sUserName;
            }

            public function setPassword($sPassword)
            {
                $this->sPassword = $sPassword;
            }

            public function getConnection()
            {
                return ($this->rConnection);
            }

            public function getDatabaseType()
            {
                return ($this->sDatabaseType);
            }

            public function getDatabaseServer()
            {
                return ($this->sDatabaseServer);
            }

            public function getDatabaseName()
            {
                return ($this->sDatabaseName);
            }

            public function getUserName()
            {
                return ($this->sUserName);
            }

            public function getPassword()
            {
                return ($this->sPassword);
            }

            public function selectDatabase($sDatabaseName)
            {
                switch ($this->getDatabaseType()) {
                    case 'MySQL':
                        mysqli_select_db($sDatabaseName);
                    break;
                    case 'MSSQL':
                        mssql_select_db($sDatabaseName);
                    break;
                    default:
                        mysql_select_db($sDatabaseName);
                }
            $this->setDatabaseName = $sDatabaseName;
            }
        }
    ?>

Этот файл содержит гораздо больше специфичных для базы данных вещей, но не имеет значения для этого основного описания доступа.

Теперь идет последняя часть, файл functionsDatabase.php , в котором заботится функция "connectToDB ()":

    <?php
        function connectToDB() {
            global $DATABASESERVER, $DATABASEUSERNAME, $DATABASEPASSWORD, $DATABASENAME, $oDatabase;

            $oDatabase = new database($DATABASESERVER, $DATABASEUSERNAME, $DATABASEPASSWORD);
            $oDatabase->selectDatabase($DATABASENAME);
        }

        [... functions with database association, not important here ...]

    ?>

Затем connectToDB(); выполняется файлом с именем general.php , на который ссылается любой другой сценарий PHP в этой CMS.

Этот код до сих пор работал безупречно, и последующие тонны процедур сохранения и чтения, обновления и удаления базы данных работали нормально.

Теперь я несколько раз пытался переключить этот код на mysqli , и я знаю теорию о его собственном объектно-ориентированном и процедурном построении, которое можно читать, например, из w3school.

Мой способ изменить что-то в mysqli выглядел так:

В PHP5_classDatabase.php я изменил следующий код (отображение только измененного контекста):

    [...]

    public function __construct($sDatabaseServer, $sUserName, $sPassword, $sDatabaseType = 'MySQL', $sDatabaseName = 'adipositas')
    {
        switch ($sDatabaseType) {
            case 'MySQL':
                //Change 1: $this->setConnection(mysqli_connect($sDatabaseServer, $sUserName, $sPassword, $sDatabaseName));
                //Change 2: $this->db = mysqli_connect($sDatabaseServer, $sUserName, $sPassword, $sDatabaseName);
                $db = mysqli_connect($sDatabaseServer, $sUserName, $sPassword, $sDatabaseName);
                $this->setDatabaseType($sDatabaseType);
                break;

    [...]

    public function selectDatabase($sDatabaseName = 'adipositas')
    {
        switch ($this->getDatabaseType()) {
            case 'MySQL':
                mysqli_select_db($this->$db, $sDatabaseName);
                break;

    [...]

    }

А в functionsDatabase.php я внес следующие изменения:

    [...]

    function connectToDB() {
        global $DATABASESERVER, $DATABASEUSERNAME, $DATABASEPASSWORD, $DATABASENAME, $oDatabase;

        $oDatabase = new database($DATABASESERVER, $DATABASEUSERNAME, $DATABASEPASSWORD, $DATABASENAME);
        $oDatabase->selectDatabase($DATABASENAME);
    }

Используя XDebug , я получаю различные сообщения об ошибках в зависимости от того, как я пытаюсь изменить потенциальный доступ к базе данных. В описываемом изменении они как таковые:

Примечание: неопределенная переменная: db в C: \ wamp64 \ apps \ adipositas \ resources \ PHP5_classDatabase.php в строке 167

... ссылаясь на:

mysqli_select_db($this->$db, $sDatabaseName);

... а также ...

Неустранимая ошибка: невозможно получить доступ к пустому свойству в C: \ wamp64 \ apps \ adipositas \ resources \ PHP5_classDatabase.php в строке 167

... имея в виду, конечно же, ту же строку.

Кто-нибудь знает, как с этим справиться или где моя ошибка?

-1
mtjmohr 7 Дек 2019 в 21:25
1
Библиотеки mssql_ тоже больше нет в PHP 7 :) Я рекомендую PDO (вы получаете MS-Server, Mysql, Postgres и еще несколько СУБД с такими же оболочками ...)
 – 
Lars Stegelitz
7 Дек 2019 в 21:30
1
Используйте $ db вместо $ this -> $ db
 – 
nbk
7 Дек 2019 в 22:31
1
 – 
Dharman
7 Дек 2019 в 22:32
1
Не обращайтесь к w3schools за учебниками по PHP. У них есть очень плохие примеры. Попробуйте что-нибудь получше, например phpdelusions.net
 – 
Dharman
7 Дек 2019 в 22:33
1
Является ли $ db из вашего соединения глобальной переменной? если не сделай так
 – 
nbk
7 Дек 2019 в 22:59

1 ответ

Итак, решение следующее:

Вот мой код mysqli :

Учетные данные определены в DBSettings.php (остается прежним):

    <?php
        // Variablen fuer den Datenbankzugriff
        $DATABASESERVER   = 'localhost';
        $DATABASENAME     = 'whatever_db';
        $DATABASEUSERNAME = 'blithering_idiot';
        $DATABASEPASSWORD = 'moronic_fool_1234_$%&/';
        $DATABASETYPE     = 'MySQL';
    ?>

Конструктор в PHP5_classDatabase.php немного изменен (затронутые строки обозначены *NEW*:

    <?php
        error_reporting(-1);
        //ini_set('display_errors', 'On');

        class database extends object
        {
            private $rConnection;
            private $sDatabaseType;
            private $sDatabaseServer;
            private $sDatabaseName;
            private $sUserName;
            private $sPassword;
            *NEW* private $db;

            public function __construct($sDatabaseServer, $sUserName, $sPassword, *NEW* $sDatabaseName, $sDatabaseType = 'MySQL')
            {
                switch ($sDatabaseType) {
                    case 'MySQL':
                        *NEW* $db = $this->setConnection(mysqli_connect($sDatabaseServer, $sUserName, $sPassword, $sDatabaseName));
                        $this->setDatabaseType($sDatabaseType);
                    break;
                    case 'MSSQL':
                        $this->setConnection(mssql_connect($sDatabaseServer, $sUserName, $sPassword));
                        $this->setDatabaseType($sDatabaseType);
                    break;
                    default:
                        *NEW* $db = $this->setConnection(mysqli_connect($sDatabaseServer, $sUserName, $sPassword, $sDatabaseName));
                    $this->setDatabaseType('MySQL');
                }
                $this->setDatabaseServer($sDatabaseServer);
                $this->setUserName($sUserName);
                $this->setPassword($sPassword);
                *NEW* this->setDatabaseName($sDatabaseName);
            }

            [...]

            public function selectDatabase(*NEW* $db, $sDatabaseName)
            {
                *NEW* global $sDatabaseServer, $sUserName, $sPassword, $sDatabaseName, $db;

                *NEW* $db = mysqli_connect('localhost', 'root', '', 'adipositas');
                *NEW* if (!$db) {
                    *NEW* echo "Error: Unable to connect to MySQL." . PHP_EOL;
                    *NEW* echo "Debugging errno: " . mysqli_connect_errno() . PHP_EOL;
                    *NEW* echo "Debugging error: " . mysqli_connect_error() . PHP_EOL;
                    *NEW* exit;
                *NEW* }

                switch ($this->getDatabaseType()) {
                    case 'MySQL':
                        mysqli_select_db(*NEW* $db, $sDatabaseName);
                    break;
                    case 'MSSQL':
                        mssql_select_db($sDatabaseName);
                    break;
                    default:
                        mysql_select_db(*NEW* $db, $sDatabaseName);
                }
            $this->setDatabaseName = $sDatabaseName;
            }
        }
    ?>

И, наконец, соответственно изменяется functionsDatabase.php :

    function connectToDB()
    {
        global $DATABASESERVER, $DATABASEUSERNAME, $DATABASEPASSWORD, $DATABASENAME, $oDatabase, $db;

        $oDatabase = new database($DATABASESERVER, $DATABASEUSERNAME, $DATABASEPASSWORD, $DATABASENAME);
        $oDatabase->selectDatabase($db, $DATABASENAME);
    }

Теперь это было только для адаптации компонентов mysql к myslqi. Поскольку mysqli_result() нет, я взял адаптацию из этого очень хорошего Справочник по StackOverflow.

Большая часть работы по обмену может быть выполнена с использованием простых глобальных исследований и режимов замены.

0
mtjmohr 8 Дек 2019 в 23:23