【发布时间】: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 是全局变量吗?如果不是这样