ADODB - 从 Mysql 切换到 Mysqli

ADODB - Switch from Mysql to Mysqli

鉴于 MySQL 即将被弃用,我需要将一个使用 ADODB 的大型网站从 MySQL 移动到 MySQLi.

现在我已经在 Whosebug 上查找了一些主题,感谢社区,我已经对需要完成的工作有了一个大致的了解。关于此事的最佳主题是那些:

ADODB mySQLi Connection

Switch large website from MySQL to MySQLi

但是,我仍然需要对使用 ADODB 的特定情况进行更多说明。

这是我用来连接数据库的:

define('DBHOST', 'db_host');
define('DBUSER', 'db_user'); 
define('DBPASS', 'db_pass');    
define('DBNAME', 'db_name'); 

include('adodb/adodb.inc.php');
$db = ADONewConnection('mysql');
$db->Connect(DBHOST,DBUSER,DBPASS,DBNAME) or die("Database not found!");

所以首先我要改变:

$db = ADONewConnection('mysql');

$db = ADONewConnection('mysqli');

我想这是最简单的部分。

既然我正在使用 ADODB,我是否还需要将 MySQL_* 函数的所有实例更改为 MySQLi_* 或 ADODB 会自动处理此问题?我想我知道答案,但无论如何都要问。

我最常用的 MySQL_ 函数是:

mysql_insert_id()
mysql_query()
mysql_fetch_array()
mysql_num_rows()
mysql_escape_string()
mysql_connect()
mysql_select_db()
mysql_error()

最常见的用法是 $variable = mysql_insert_id();$v1 = mysql_query($v);

对于 ADODB,从 MySQL 迁移到 MySQLi 时,还有什么我应该考虑的吗?

"do I also need to change all instances of MySQL_* functions to MySQLi_* ?"

答案是肯定的。不同MySQLAPIs/functions不要混用。您必须使用相同的 API/functions 从连接到查询。

您可以使用以下函数,只需将 mysql_ 替换为 mysqli_,同时在需要它的函数中将数据库连接作为第一个参数传递。

  • mysqli_query($connection, $query).

它们标有星号 *

mysqli_insert_id() - *
mysqli_query() - *
mysqli_fetch_array()
mysqli_num_rows()
mysqli_escape_string() - *
mysqli_connect() - *
mysqli_select_db() - *
mysqli_error() - *

1) 我建议您使用 pdo_mysql 而不是 mysql,因为它对交易有更好的支持。

2) ADODB 使用连接字符串中的 dsn 标识符初始化正在使用的驱动程序(例如 mysql 或 pdo_mysql),即 pdo_mysql://localhost/mydb 或mysql://localhost/mydb.

只需在连接字符串中切换 mysql -> pdo_mysql,它就会开始使用 mysqli -driver。

3) 驱动程序加载逻辑位于 adodb.inc.php 的 ~4860 行,至少在我使用的 composer 版本中,没有开关可以配置 mysql i,但如果您有 PHP 7.0.0 或更高版本,它会自动升级 mysql -> mysqli。您也可以通过添加一个 if 语句来调整此代码以强制执行 mysqli,但是这样您就有了 ADODB 的自定义分支。也许做一个拉取请求。

        case 'mysql':
            // mysql driver deprecated since 5.5, removed in 7.0
            // automatically switch to mysqli
            if(version_compare(PHP_VERSION, '7.0.0', '>=')) {
                $db = 'mysqli';
            }
            $class = $db;
            break;