首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对MySQL连接使用单例模式

对MySQL连接使用单例模式
EN

Code Review用户
提问于 2019-01-24 11:58:44
回答 1查看 2.7K关注 0票数 4

我对网络编程很陌生,我还编写了一些web,以使用户能够在设备之间同步他们的数据。

使用单例模式to可以防止在每个MySQL调用中重新连接吗?

代码语言:javascript
复制
ping())
        {
            $connection = new mysqli("localhost", "id", "password", "database");
        }

        return $connection;
    }

    public function execute(string $sql, iterable $params) : void
    {
        if ($statement = $connection->prepare($sql))
        {
            foreach ($params in $param)
            {
                if (is_int($param))
                {
                    $statement->bind_param("i", $param);
                }
                else if (is_double($param))
                {
                    $statement->bind_param("d", $param);
                }
                else if (is_string($param))
                {
                    $statement->bind_param("s", $param);
                }
            }

            $statement->execute();
            $statement->close();
        }
    }

    public function getResult(string $sql, iterable $params) : mysqli_result
    {
        if ($statement = $connection->prepare($sql))
        {
            foreach ($params in $param)
            {
                if (is_int($param))
                {
                    $statement->bind_param("i", $param);
                }
                else if (is_double($param))
                {
                    $statement->bind_param("d", $param);
                }
                else if (is_string($param))
                {
                    $statement->bind_param("s", $param);
                }
            }

            $statement->execute();

            $result = $statement->get_result();
            $statement->close();

            return $result;
        }
    }
}

// example
MySQLiConnection::getInstance()->execute("SELECT * FROM users WHERE forename = ? AND surname = ?", "ben", "dover");

?>
EN

回答 1

Code Review用户

回答已采纳

发布于 2019-01-24 12:24:26

首先,在你的房子里。

  • 首先,no模式将阻止MySQL在每个web调用上连接到MySQL数据库。因为PHP会死在不同的API调用之间,以及它的所有单点、连接和任何其他东西之间。因此,您所能阻止的就是在每次调用数据库连接类时重新连接MySQL数据库。
  • 不,不赞成使用单例模式来防止在每次调用数据库连接类时重新连接MySQL数据库。一种更被接受的方法是依赖注入。
  • 有趣的是,由于一个错误,这个类would不阻止重新连接mysql。如果您将error_reporting设置为E_ALL,则PHP将指示您每次调用getInstance()时都试图使用不存在的变量$connection。当然,你想把它叫做$this->connection

现在是密码。

意图是非常好的,特别是我喜欢getResult()execute()方法,它们允许您避免绑定param的麻烦。然而,显然有一个重复的代码。为什么不让执行返回$statement?它将使getResult()变得像

代码语言:javascript
复制
public function getResult(string $sql, iterable $params) : mysqli_result
{
    return $this->execute($sql, $params)->get_result();
}

最后。我刚刚注意到,在评审过程的一半,您的代码偏离了主题,因为它根本无法工作。Mysqli不是PDO,您不能在循环中绑定参数。所以你得重新装修一下。为了提供帮助,以下是我的两篇文章:

票数 2
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/212136

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档