从mysql连接迁移到mysqli

时间:2012-12-08 11:18:24

标签: php mysql connection mysqli

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

openDBConn();
$car_model = getCarModel($car_id);
$car_color = getCarColor($car_id);
closeDBConn();

这样做也允许我做以下

openDBConn();
mysqlStartTranscation();

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

mysqlCommit();
closeDBConn();

现在的困境是,如果我转移到mysqli,我将需要通过连接链接。

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

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

2 个答案:

答案 0 :(得分:14)

  1. 因为他们永远不会停止自己的工作,所以你一直都在世界上!
  2. 是的,有几种方法可以做到这一点。
  3. 是的,但没有一个通用的解决方案。每种情况都不同,对你来说特殊情况可能不适合所有情况。
  4. 首先,旧的ext / mysql从PHP 5.5.0开始不推荐使用,但它永远不会完全停止工作,因为扩展本身最终会被移动到PHP PECL repository到时候到了删除它)。但是,我们还没有,只有当您选择升级到该版本的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
    }
    

    或者您可以使用OOP ...

    使用类静态变量执行此操作
    Class MyDBConnect {
    
        public static $link;
    
        public function openDBConn() {
            if (!isset(static::$link)) {
                static::$link = new mysqli('localhost', 'my_user', 'my_password', 'my_db');
            }
        }
    
    }
    

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

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

答案 1 :(得分:3)

首先,我给你的问题+1,因为你开始迁移是件好事。

OOP和参数

关于OOP编程和参数传递,这里是一个基于Singleton Factory模式的解决方案:

class MysqliConnection{
   private static $connection = null;
   public static function getConnection(){


       if(self::$connection === null){
           //Here get some routine to make your configuration extern
           self::$connection = new Mysqli(/*args*/);
       }
       return self::$connection;
}

如果要发送查询,可以使用它:

 function methodWhichSendsAQuery(){
      $mysqli = MysqliConnection::getConnection();
      $query = $mysqli->prepare(/*your query*/);
      /*some param bindings with $query->bindParam()*/
      $query->execute();
      return $query->fetchAll(); //an array with all results
  }

我将此解决方案优先于其他解决方案,因为它清晰,可读并且不依赖于全局变量。单一责任原则得到尊重,没关系。

将mysql_重构为mysqli

如果您习惯于以旧方式处理mysql_,重构可能非常困难,我的意思是没有ressource参数,mysql_escape_string等等。

Mysql提供了一个从mysql_迁移到mysqli here的强大功能的脚本,你可以获得更多信息here

我可以对你说的是,mysqli带来了一个名为“准备好的陈述”的功能,它强大而且强大且安全性强。 mysqli处理预处理语句的方式不像PDO那样用户友好,但属性是相同的。