21

我有一个用于我的脚本的函数。这些都称为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 方式最好的是什么?
4

2 回答 2

15
  1. 您拥有世界上所有的时间,因为他们永远不会停止自己的工作!
  2. 是的,有几种方法可以做到这一点。
  3. 是的,但没有一种万能的解决方案。每种情况都不同,适合您的特定情况可能并不适合每种情况。

首先,旧的 ext/mysql 自 PHP 5.5.0 起已弃用,但它永远不会完全停止工作,因为扩展本身最终将被移动到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
}

或者您可以使用 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准备好的语句和参数化查询

我想让您注意的是使用较新的 API 与您的 MySQL 数据库(即PDO 和 MySQLi)交互的好处。

于 2012-12-08T11:33:58.547 回答
3

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

OOP 和参数

关于 OOP 编程和参数传递,这是一个基于单例工厂模式的解决方案:

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 ,您可以在此处获取更多信息。

我可以对你说的是,mysqli 带来了一个名为“prepared statement”的功能,它在安全性方面非常强大。mysqli 处理准备好的语句的方式不如 PDO 的方式对用户友好,但属性是相同的。

于 2012-12-08T11:31:10.117 回答