PHP - 多个不同的数据库依赖注入类

2024-05-05

我花了过去几个小时试图找到“最佳”、最合乎逻辑的方法的答案,以编写一个 php 数据库类以同时连接到一个 postgresql 数据库和一个 mysql 数据库。另外,我想采用依赖注入设计,但对整个概念还是陌生的。

到目前为止我已经想出了...

class Database {

    public function PgSqlConnect() {
            /* Connect to database */
        $host = 'localhost';
        $dbname = '---';
        $user = '---';
        $pass = '---';
        $timeout = 5;   /* seconds */

        try {
            $pgsql_dbh = new PDO("pgsql:host=$host; dbname=$dbname", $user, $pass); 
            $pgsql_dbh->setAttribute( PDO::ATTR_TIMEOUT, $timeout ); 
            $pgsql_dbh->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );

            return $pgsql_dbh;
        } catch( PDOException $e ) {
            echo 'Unable to connect to database: ' . $e->getMessage();
        }
    }


    public function MySqlConnect() {
            /* Connect to database */
        $host = 'localhost';
        $dbname = '---';
        $user = '---';
        $pass = '---';
        $timeout = 5;   /* seconds */

        try {
            $mysql_dbh = new PDO("mysql:host=$host; dbname=$dbname", $user, $pass); 
            $mysql_dbh->setAttribute( PDO::ATTR_TIMEOUT, $timeout ); 
            $mysql_dbh->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );

            return $mysql_dbh;
        } catch( PDOException $e ) {
            echo 'Unable to connect to database: ' . $e->getMessage();
        }
    }

}

显然,重复的代码违反了 DRY 方法。我知道并且见过许多多个数据库连接的示例,但大多数都处理相同的驱动程序并且不提供 DI 功能。

我还应该补充一点,我已经考虑将连接详细信息放入数据库类构造函数中,因为......

$driver = 'mysql';
...
$mysqldb = new Database($driver,$un,$pw,...);

$driver = 'pgsql';
...
$pgsqldb = new Database($driver,$un,$pw,...);

但我不知道这是否真的是一个好主意,也不知道它与 DI 的配合效果如何。

非常感谢!


您应该首先为所有数据库操作创建一个接口。

interface IDatabase
{
    function connect();
    function query();
    ...
}

然后让不同的驱动类实现这个接口

class MySQLDB implements IDatabase
{
}
class PGSQLDB implements IDatabase
{
}

这样你就可以轻松地使用依赖注入。

class Test
{
   private $db;

   function __construct(IDatabase $db)
   {
        $this->db = $db;
   }
}

您可以将其称为:

$mysqldb = new MySQLDB();
$test = new Test($mysqldb);
or
$pgsqldb = new PGSQLDB();
$test = new Test($pgsqldb);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PHP - 多个不同的数据库依赖注入类 的相关文章

  • Mysql UUID_SHORT() 与 UUID() 相当吗

    如果您愿意的话 请快速提出问题或意见 我需要为数据库表生成一些 UUID 自动递增密钥不会减少它 因为我还需要密钥在数据库和系统中保持唯一 UUID 工作正常 但其输出对于行将导出到的某些系统来说太长 UUID SHORT 做得很好 我已经
  • 如何处理多个连接

    我有一个复杂的查询 需要总共 4 个表中的字段 内部联接导致查询花费的时间比应有的时间长得多 我已经运行了一个 EXPLAIN 语句 其可视化结果附在下面 这是我的查询 SELECT pending corrections correcte
  • 仅当用户打印时如何重定向到另一个页面

    我一直在尝试找到一种在用户实际打印时重定向到另一个页面的方法 也就是说 只有当他们从打印时打开的选项卡中单击该打印按钮时 我才想重定向 我不想要这种方法 function myFunction window print window loc
  • 为数据库生成随机 ID

    我对一个项目有一个要求 我需要生成唯一的 ID ID 必须大写 我无法检查数据库以查看 ID 是否已被使用过 我们预计每个月都会有数百万条记录添加到数据库中 我在这里尝试过解决方案 PHP 如何生成随机的 唯一的字母数字字符串 https
  • Angular 2 Renderer2 - 它是如何工作的

    我试图理解在 Angular 2 的指令或组件中添加 renderer2 装饰的必要性 来自文档 渲染器2文档 https angular io api core Renderer2他们没有提供其工作原理的示例 谁能用完整的例子解释一下 请
  • 将优惠券百分比添加到 WooCommerce 中的购物车页面

    我试图在购物车页面中显示优惠券百分比 但收到几个错误 这是我的自定义代码 Add Coupon Percentage to Cart function my coupon percentage cart value coupon if co
  • 雄辩的致命错误:参数传递的实例不正确

    我正在使用 Slim 和 Eloquent 在 PHP 中构建端点系统 如上所述here http www slimframework com news slim and laravel eloquent orm 在我的本地开发中运行它时
  • nginx + php-fpm = 找不到文件

    当我尝试访问时info php我得到一个File not found error 我尝试了一些教程但无济于事 配置 默认 server listen 80 listen 80 default ipv6only on server name
  • MySQL分层存储:搜索所有父母/祖父母等。给定子节点 id 的节点?

    我使用分层模型存储类别 如下所示 CATEGORIES id parent id name 1 0 Cars 2 0 Planes 3 1 Hatchbacks 4 1 Convertibles 5 2 Jets 6 3 Peugeot 7
  • 如何在chart.js中使用JSON数据?

    您好 我一直在尝试使用 MYSQL 数据库中的数据 并使用它们通过 Chart js 创建图形图表 我将数据编码为 JSON 数据 通过 php 文件名 data1 php 现在我需要使用 Jquery 或 javascript 将这些 J
  • 将平面数组拆分为分组子数组,其中包含输入数组中连续键的值

    我有一个数组array diff函数 如下所示 Array 0 gt world 1 gt is 2 gt a 3 gt wonderfull 5 gt in 6 gt our 正如您所看到的 键 3 和键 5 之间有一个间隙 即没有键 4
  • 在静态类中存储连接 (ASP.NET)

    由于我使用的是 Postgresql 并且无法使用 LINQ to SQL 因此我编写了自己的包装器类 这是学生课程的一部分 public class Student User private static NpgsqlConnection
  • 如何更改数组键从 1 而不是 0 开始[重复]

    这个问题在这里已经有答案了 我在某个数组中有值 我想重新索引整个数组 以便第一个值键应该是 1 而不是零 即 默认情况下 PHP 中的数组键从 0 开始 即0 gt a 1 gt b 我想重新索引整个数组以从 key 1 开始 即1 gt
  • 无法访问扩展 Symfony\Bundle\FrameworkBundle\Controller\Controller 的控制器中的 Symfony2 容器

    原始问题 我已经阅读了 book http symfony com doc current book service container html 关于服务容器 我仍然感到困惑 因为几乎每次我尝试使用时 事情似乎都随机不起作用 this g
  • PHP通知和警告的区别

    当编写代码错误时 可能会出现警告和通知 我知道错误背后的想法 我想警告是为了通知您可能导致错误的事情 但通知不是完全相同吗 我认为通知并不是某件事做得正确的消息 这让我有点困惑 任何人都可以区分这两者之间的区别以及应该如何处理这些消息 通知
  • 我可以使用 vim “star” 搜索来搜索 PHP 类成员和方法吗?

    vim 星号 星号搜索 help star 是一个很棒的功能 它可以让您找到光标所在单词的下一个出现位置 不幸的是 它将美元前缀视为字符串的一部分 因此如果我在类名中的 SearchTerm 上方按 它会在注释中找到 SearchTerm
  • 从 array_map 匿名函数内部调用类方法

    我正在尝试从一个对象中调用我的对象的方法之一array map匿名函数 到目前为止 我收到了预期的错误 致命错误 不在对象上下文中时使用 this 我知道为什么我会收到此错误 我只是不知道如何实现我想要的目标 有人有任何建议吗 这是我当前的
  • Twitter URL 编码

    我们即将发起一场小小的推特圣诞竞赛 但我遇到了一些小障碍 要进入 人们需要按以下格式发布推文 user blah blah blah hashtag 目前 我有一个表单 他们可以在其中输入答案 废话 废话 废话 和一个 PHP 脚本 该脚本
  • 单击保存文件

    我希望能够通过单击下载 csv 文件 而不是在浏览器中打开 我把这段代码 a href file csv download file a 但单击它会在浏览器中打开 v 文件 在本地主机中 当我单击链接时 它正在下载 但在服务器上时 它在浏览
  • 使用 PHP MySql 进行关键字搜索?

    我的 mysql 表中有标题 varchar 描述 text 关键字 varchar 字段 我保留了关键字字段 因为我认为我只会在这个字段中搜索 但我现在需要在所有三个字段中进行搜索 所以对于关键字 word1 word2 word3 我的

随机推荐

  • 将 cookie 设置为在会话结束时过期? ASP.NET

    我很惊讶我找不到任何答案 如何将 cookie 中的 sessionid 设置为在会话结束时过期 当浏览器关闭或用户一段时间不活动时 我发现的两个解决方案是 httpcookie Expires HttpContext Current Se
  • VS Code 自动保存文件历史记录/撤消[重复]

    这个问题在这里已经有答案了 vscode 的自动保存功能非常方便 但有时会有点麻烦 如果有一种方法可以查看自动保存的文件的先前版本 这将非常有用 VS Code 有这样的功能吗 VSCode 1 66 2022 年 3 月 无需扩展 现在它
  • 如何在 Groovy 2.3 中使用 @SourceURI 注释检索脚本文件的完整路径?

    我需要在运行时检索 Groovy 2 3 中脚本文件的完整路径 实际上我遇到了与这里描述的问题相同的问题 在运行时获取 groovy 源文件的路径 https stackoverflow com questions 11958185 get
  • 如何用Python从网站中提取表格

    Here http www ffiec gov census report aspx year 2011 state 01 report demographic msa 11500 这里有张桌子 我的目标是提取表格并将其保存到 csv 文件
  • 如何在iOS SDK中使用语音识别? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我知道 SIRI 服务没有公共 API 但是有没有简单的语音识别 API 因此 如果我有一个文本字段并且
  • C# 中从一个字符到另一个字符的子字符串

    如何获取从一个特定字符到另一个特定字符的子字符串 例如 如果我有这种格式 string someString 1 7 2015 05 21T09 18 58 我只想得到这部分 2015 05 21T09 18 58 我如何使用子字符串 字符
  • OSError:[Errno 'jupyter-notebook' 未找到] 2

    您好 我已经安装了 Anaconda3 4 3 1 Windows x86 64 在我的桌面上 但运行命令时出现以下错误 Jupyter笔记本 来自命令提示符 Error C Users my pc gt jupyter notebook
  • 正则表达式获取“-”之前的所有字符

    如何获取字符之前的字符串 使用正则表达式 例如 我有 text 1 我想回来 text 所以我看到了实现这一目标的许多可能性 string text Foobar test 正则表达式 匹配所有内容 直到第一个 Match result R
  • 如何从服务器控件中删除“名称”属性?

    asp net端的控制代码如下
  • Postgres: \copy 语法

    使用 CentOS 7 上的 PostgreSQL 9 5 我创建了一个名为sample还有几张桌子 我有 csv数据输入 home MyUser data对于每张桌子 例如 存在TableName csv用于餐桌 TableName 如何
  • 如何获取表的模式名称

    我正在使用 SQL Server 2008 并有以下查询 SELECT SO1 name AS Tab SC1 name AS Col SO2 name AS RefTab SC2 name AS RefCol FO name AS FKN
  • 在 Ubuntu 上运行独立的 ASP.NET Core 应用程序

    我已经发布了一个 ASP NET Core 应用程序作为针对 Ubuntu 的独立应用程序 发布似乎工作正常 我已将这些文件复制到一台漂亮的 Ubuntu 机器上 现在 我如何运行我的应用程序 我的理解是 因为它是一个独立的 NET Cor
  • 在 R 中不循环地对连续的列表元素对应用函数

    我试图找到一种有效的 即避免使用循环 方法来应用一个函数 该函数迭代地将列表的当前和前一个 或下一个 元素作为参数 并返回结果列表 其长度必然是短 1 个元素 作为一个具体的例子 我有一个在某些图中定义路径的顶点列表 vlist lt c
  • Flex - 自动调整数据网格大小的问题

    我正在尝试创建一个数据网格 它将垂直调整大小以确保所有渲染器完整显示 此外 渲染器的高度可变 渲染器可以自行调整大小 一般来说 事件的流程如下 项目渲染器之一会自行调整大小 通常响应用户单击等 它调度父数据网格拾取的冒泡事件 DataGri
  • 如何在 Angular 2 中封装动态添加的元素?

    尝试让 MDL 与 Angular2 一起工作 通过 Shadow DOM 模拟 Angular 封装了从代码中获得的所有 CSS 和 html 但是当我使用componentHandler upgradeElement 它创建没有封装的新
  • 在二进制 R 包中包含测试

    我在用testthat为我的 R 包编写单元测试 我见过一些软件包作者 比如来自Rcpp and ggplot2 使用二进制文件分发单元测试 但是 当我使用 RStudio 0 98 1102 构建包时devtools 1 7 0 test
  • 从 Spring 4.1.6 升级到 4.2.4 突然出现 TransactionRequiredException

    我已经从 4 1 6 Release 升级到最新的 Spring 版本到 4 2 4 Release 突然之间 之前运行顺利的所有功能现在抛出以下异常 javax persistence TransactionRequiredExcepti
  • MongoDB - 手册参考示例

    我正在读手册参考 http docs mongodb org manual reference database references document referencesMongoDB 数据库参考文档的一部分 但我不太理解 解析引用字段
  • 调整浏览器大小时CSS边框影响宽度

    我使用以下方法制作了两个简单的导航菜单ul and li 一种是无边框的 另一种是有边框的 两个菜单的宽度固定为 400px 在第一个菜单中我给了每个li固定宽度为 100px 在第二个菜单中 根据宽度计算 我给出了固定宽度 98px 左右
  • PHP - 多个不同的数据库依赖注入类

    我花了过去几个小时试图找到 最佳 最合乎逻辑的方法的答案 以编写一个 php 数据库类以同时连接到一个 postgresql 数据库和一个 mysql 数据库 另外 我想采用依赖注入设计 但对整个概念还是陌生的 到目前为止我已经想出了 cl