【问题标题】:How to convert PHP mysql to mysqli in object-oriented coding?如何在面向对象编码中将 PHP mysql 转换为 mysqli?
【发布时间】:2019-12-07 18:25:29
【问题描述】:

我在这里阅读了几乎所有关于这个主题的参考资料。我个人的问题是我有一个 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 的文件执行,此 CMS 中的任何其他 PHP 脚本都会引用该文件。

到目前为止,这段代码运行良好,随后大量的数据库保存、读取、更新和删除过程运行良好。

现在,我已经多次尝试将该代码切换到 mysqli,并且我确实知道有关其本机面向对象和过程构造的理论,例如,w3school .

我将事物更改为 mysqli 的方式如下所示:

PHP5_classDatabase.php 我将 tp 更改为以下代码(仅显示更改后的上下文):

    [...]

    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,我会收到各种错误消息,具体取决于我如何更改对数据库的潜在访问权限。在所描述的变化中,它们是这样的:

注意:未定义变量:第 167 行 C:\wamp64\apps\adipositas\resources\PHP5_classDatabase.php 中的 db

...指的是:

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

...和...

致命错误:无法访问第 167 行 C:\wamp64\apps\adipositas\resources\PHP5_classDatabase.php 中的空属性

...当然是指同一行。

有人知道如何处理这个问题或我的错误在哪里吗?

【问题讨论】:

  • mssql_ 库在 PHP 7 中也不再存在 :) 我的建议是 PDO(您可以获得 MS-Server、Mysql、Postgres 和更多具有相同包装器的 RDBMS...)
  • 使用 $db 代替 $this->$db
  • 不要参考 w3schools 的 PHP 教程。他们有非常糟糕的例子。尝试更好的方法,例如 phpdelusions.net
  • 连接中的 $db 是全局变量吗?如果不是这样

标签: php mysql mysqli


【解决方案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 reference中改编。

大部分的交换工作可以通过简单的全球研究和替换模式来完成。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-27
    • 1970-01-01
    • 2013-03-03
    • 1970-01-01
    • 2019-11-07
    • 1970-01-01
    相关资源
    最近更新 更多