从mysql连接迁移到mysqli

Jms*_*Bnd 21 php mysql connection mysqli

我有一个我以前用于脚本的函数.openDBConn()closeDBConn()这些都被称为mysql_connect()功能.使用如下所示

openDBConn();
$car_model = getCarModel($car_id);
$car_color = getCarColor($car_id);
closeDBConn();
Run Code Online (Sandbox Code Playgroud)

这样做也允许我做以下事情

openDBConn();
mysqlStartTranscation();

upgradeCarColor($car_id);
addNewWing($car_id);

mysqlCommit();
closeDBConn();
Run Code Online (Sandbox Code Playgroud)

现在的困境是,如果我转移到mysqli,我将需要传递连接链接.

我还看到mysql_*被弃用了我的问题:

  1. 在我的大部分功能停止工作之前,我有多少时间?
  2. 有没有当前或未来的方式来访问当前的mysqli连接,因为在我的函数中添加额外的参数会很痛苦?
  3. 是否有任何正确的编码方式以程序方式访问当前的mysqli连接链接.如果不是程序性的,那么以OOP方式最好的是什么?

She*_*rif 14

  1. 你一直在世界上,因为他们永远不会停止自己的工作!
  2. 是的,有几种方法可以做到这一点.
  3. 是的,但没有一个通用的解决方案.每种情况都不同,对你来说特殊情况可能并不适用于所有情况.

首先,从PHP 5.5.0开始不推荐使用旧的ext/mysql,但它永远不会完全停止工作,因为扩展本身最终会被移动到PHP PECL存储库中(当需要删除它时).但是,我们还没有,只有当您选择升级到该版本的PHP时才会受到影响.没有确定的时间来删除扩展名.

其次,您可以使用变量来存储数据库连接,就像旧的ext/mysql扩展在幕后为您做的那样.诀窍是你不知道它在做什么(它使用你在调用mysql_connect时创建的最后一个打开的连接,并在每次调用类似mysql_query的东西时使用它来访问数据库).

您可以使用程序样式在函数中使用静态变量执行此操作....

function openDBConn() {
    static $link;
    if (!isset($link)) {
      $link = mysqli_connect('localhost', 'my_user', 'my_password', 'my_db');
    }
    return $link; // returns the link
}
Run Code Online (Sandbox Code Playgroud)

或者您可以使用OOP使用类静态变量执行此操作...

Class MyDBConnect {

    public static $link;

    public function openDBConn() {
        if (!isset(static::$link)) {
            static::$link = new mysqli('localhost', 'my_user', 'my_password', 'my_db');
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

我想鼓励你使用更新的API,我赞扬你,但我也想在你前进时提醒你.当您开始将函数从旧的ext/mysql函数移植到新的mysqli扩展时,请注意不要同时移植旧扩展的错误做法(例如使用旧的SQL字符串连接和转义技术ext/mysql提供).而是利用MySQLi 预处理语句和参数化查询.

我想要引起你注意的是使用较新的API与MySQL数据库(即PDO和MySQLi)连接的好处.