已经使用mysql_connect - 我还应该使用mysqli_connect吗?

时间:2014-02-20 13:23:24

标签: php mysql mysqli

首先,一些背景知识:我正在开发一个2000之前的网站,它在任何地方都使用mysql_connectmysql_*个功能。目前简单地替换所有这些是不可行的。

但是,我确实计划慢慢改变mysqli_*功能。我遇到了一个我需要使用mysqli_multi_query的实例,并且想知道它是否会更好:

  1. 创建一个打开和关闭mysqli连接的函数,同时执行一个mysqli_multi_query。
  2. 创建一个在需要时打开mysqli连接的函数,只在需要它的页面上打开mysqli连接。
  3. 只需使用mysqli_connect()功能,就像我使用mysql_connect()功能一样,并且在我的脚本开头连接,最后在所有页面上关闭。
  4. 我在决定这些问题时遇到的麻烦是 1 限制了我可以在一个页面上执行的多个查询的数量(同时还增加了需要完成的未来代码清理) ), 2 也增加了代码清理,虽然没有 1 那么多, 3 可能效率低或不安全,虽然我可以在遇到旧查询时进行清理。

    该网站每月访问量超过100万。

    任何人都知道在这种情况下什么是“最佳实践”?

2 个答案:

答案 0 :(得分:0)

"最佳实践"似乎是在你的MySQL连接中使用PDO,根据最近在搜索主题时出现的文章(例如https://phpbestpractices.org/#mysql),虽然我找不到关于何时打开这些连接的任何具体指导,如果在该页面上并不严格要求它们。

我建议选择第二种选择,因为抽象使代码在未来对您和其他开发人员来说更易于管理和维护。据我所知,并排使用mysql_*mysqli_*函数没有特定的缺点,建议在所有mysqli_*上使用mysql_*例 (请参阅http://www.php.net/manual/en/mysqlinfo.api.choosing.php,'推荐的API')下的部分。

但是,在完成转换之前,您的代码将不会像以前那样安全。

我想说的是,在没有严格要求的情况下是否打开连接是对你的判断要求 - 我倾向于只在你需要时根据效率的一般原则打开它,不过在处理遗留代码时练习它可能比它的价值更麻烦。如果你的服务器没有太慢,你可以忍受它,只要你认识到它并不是最有效的方式。

答案 1 :(得分:0)

PHP提供三种不同的API来连接MySQL:mysql(过时),mysqli和PDO扩展。

您无需在每次请求时连接到数据库。

mysqli_connect() with p: host prefix
//or
PDO::__construct() with PDO::ATTR_PERSISTENT as a driver option

http://www.php.net/mysql_pconnect

在您的情况下,我将使用PDO类型连接实现为具有“永久”连接选项的单例模式。

包含在每个脚本的顶部。

class Database {
    private static $instance;
    private $dsn = 'mysql:dbname=testdb;host=127.0.0.1';
    private $user = 'dbuser';
    private $password = 'dbpass';


    public static function getInstance() {
        if(!self::$instance) {
            self::$instance = 
               new PDO($this->dsn, 
                       $this->user, 
                       $this->password, 
                       array(PDO::ATTR_PERSISTENT)
               );
        }
        return self::$instance;
    }
}

这样你可以通过以下方式获取数据库实例:

Database::getInstance();

...并且不要因为在遗留应用中使用单身而激怒我! ;)