当前位置: 首页 > 知识库问答 >
问题:

在面向对象编码中如何将PHP mysql转换为mysqli?

白烨煜
2023-03-14

我已经阅读了这里几乎所有关于这个话题的参考文献。我的个人问题是,我有一个OOP CMS,它是使用早已被弃用的mysql数据库访问进行编码的。现在我的任务是从PHP5.6升级到PHP7.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);

...还有...

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

…当然是指同一条线。

有没有人知道怎么处理或者我的错误在哪里?

共有1个答案

赫连冠玉
2023-03-14

所以解决方案如下:

下面是我的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引用中进行了修改。

大多数交换工作可以使用简单的全球研究和替换模式来完成。

 类似资料:
  • 问题内容: 如何将java对象转换为InputStream? 问题答案: 您可以使用ObjectOutputStream 您将对象(以下代码中的obj)写入ObjectOutputStream,要转换为输入流的对象必须实现Serializable。

  • 问题内容: 如何在Java中将对象转换为int? 问题答案: 如果您确定该对象是: 或者,从Java 7开始,您可以等效地编写: 当心,它可以抛出一个,如果你的对象是不是和你要的对象是。 这样,您就假定对象是一个整数(包装的int),然后将其拆箱为一个int。 是基元,因此不能将其存储为,唯一的方法是将考虑/装箱为,然后存储为。 如果您的对象是,则可以使用方法将其转换为简单的int: 如果您的对象

  • 问题内容: 如何将String对象转换为Date对象? 我想我需要做这样的事情: 任何帮助将不胜感激。 问题答案: SimpleDateFormat dateFormat = new SimpleDateFormat(“dd.MM.yyyy”); Date date = dateFormat.parse(“1.1.2001”); 有关详细信息,请参阅: SimpleDateFormat文档

  • 问题内容: 如何将Python对象转换为对象? 我有一个提供第一个库的库,另一个提供了第二个库的库。 问题答案: 使用time.mktime()将时间元组(以当地时间为单位)转换为自大纪元以来的秒数,然后使用datetime.fromtimestamp()获得datetime对象。

  • 问题内容: 我声明了两个Realm表: 最终目标是将Task Realm对象转换为JSON。我在想的方法是: 使用类中的方法将对象转换为字典 使用SwiftyJSON将结果字典转换为JSON 现在,这可以转换,但是: 有一个更好的方法吗? 如何将RLMArray转换为数组以进行JSON转换? 问题答案: 设法在这里找到答案: 我可以在Realm forSwift中将RealmObject序列化为J

  • 问题内容: 为这个简单的问题表示歉意…我是Python的新手…我四处搜寻,似乎没有任何反应。 我有一堆datetime对象,我想计算每个对象过去某个固定时间以来的秒数(例如,自1970年1月1日起)。 这似乎只能区分具有不同日期的日期: 任何帮助深表感谢。 问题答案: 在1970年1月1日这个特殊日期,有多种选择。 对于任何其他开始日期,您需要以秒为单位获取两个日期之间的差额。将两个日期相减得到一