实现mysqli连接的最佳实践/最实用的方法

Posted

技术标签:

【中文标题】实现mysqli连接的最佳实践/最实用的方法【英文标题】:Best practices / most practical ways to implement mysqli connections 【发布时间】:2020-09-18 14:49:56 【问题描述】:

我正在努力简化我们的数据库助手和实用程序,我看到我们的每个功能,例如 findAllUsers()....findCustomerById($id) ... 都有自己的连接详细信息,例如:

function findAllUsers() 
    $srv = 'xx.xx.xx.xx';
    $usr = 'username';
    $pwd = 'password';
    $db = 'database';
    $port = 3306;
    $con = new mysqli($srv, $usr, $pwd, $db, $port);

    if ($con->connect_error) 
        die("Connection to DB failed: " . $con->connect_error);
     else 
        sql = "SELECT * FROM customers..."
        .....
        .....
    


对于每个帮助器/函数等等。所以我考虑使用返回连接对象的函数,例如:

function dbConnection ($env = null) 
    $srv = 'xx.xx.xx.xx';
    $usr = 'username';
    $pwd = 'password';
    $db = 'database';
    $port = 3306;
    $con = new mysqli($srv, $usr, $pwd, $db, $port);

    if ($con->connect_error) 
        return false;
     else 
        return $con;
    

那我就可以了

function findAllUsers() 
    $con = dbConnection();
    if ($con === false) 
        echo "db connection error";
     else 
        $sql = "SELECT ....
        ...
    

$con = new dbConnection() 这样的 Class 系统相比,使用这样的函数有什么优势吗?

【问题讨论】:

两者都非常糟糕。 嘿,常识,情况如何?我知道开销类使用的气味会迅速吸引啊哈。但是使用一个函数也有那么糟糕吗? 【参考方案1】:

您应该只打开一次连接。一旦你意识到你只需要打开一次连接,你的函数dbConnection就变得没用了。您可以在脚本开头实例化 mysqli 类,然后将其作为参数传递给所有函数/类。

连接总是相同的三行:

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$con = new mysqli($srv, $usr, $pwd, $db, $port);
$con->set_charset('utf8mb4');

然后只需将其作为参数传递,不再对if 语句执行任何检查。

function findAllUsers(\mysqli $con) 
    $sql = "SELECT ....";
    $stmt = $con->prepare($sql);
    /* ... */

看起来您的代码是某种意大利面条式代码。因此,我强烈建议重写它并将 OOP 与 PSR-4 一起使用。

【讨论】:

以上是关于实现mysqli连接的最佳实践/最实用的方法的主要内容,如果未能解决你的问题,请参考以下文章

MSSQL - 最佳实践 - 使用SSL加密连接

JQuery 命名空间的最佳实践 + 通用实用程序函数

响应 keyDown 事件的最佳实践

52合1Node.js 最佳实践大合集

在 PHP 中执行参数化查询的最佳实践? [复制]

iOS开发——MD5的最佳实践