我已经阅读了这里几乎所有关于这个话题的参考文献。我的个人问题是,我有一个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行的空属性
…当然是指同一条线。
有没有人知道怎么处理或者我的错误在哪里?
所以解决方案如下:
下面是我的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日这个特殊日期,有多种选择。 对于任何其他开始日期,您需要以秒为单位获取两个日期之间的差额。将两个日期相减得到一