【问题标题】:database query's from class object with php使用 php 从类对象查询数据库
【发布时间】:2010-11-13 23:18:12
【问题描述】:

我的问题是:

我还能在这样的对象中进行查询吗:

$result = mysql_query ($q,$dbc) 
          or 
          trigger_error("Query: $q\n<br />MySQL Fout: " . mysql_error($dbc));

通过将全局 dbconnection 变量$dbc 传递给构造函数

或者有更好的方法吗?

或者为数据库连接创建一个单例类,但是 我看到人们写的很多消极情绪。

我是制作对象的新手,所以我不知道我是否需要做一点点 不同,我的意思是 db。

谢谢,理查德

【问题讨论】:

  • 妈的,我好想知道他决定做什么……

标签: php database design-patterns oop class


【解决方案1】:

如果您正在寻找数据库抽象,为什么不考虑使用 Zend Framework 提供的 DB 类。

它们还包括一种将适配器设置为默认值的方法,从而可以快速执行操作。

此外,Zend_Db 默认使用参数化查询而不是老式的引用查询,因此增加了安全性和安心。

使用全局变量是一个非常糟糕的主意,它太容易被意外覆盖!以及您会发现不通过快速 google 使用它们的所有其他原因。

使用 Zend Framework 建立数据库连接非常简单,

$db = Zend_Db::factory('Pdo_Mysql', array(
'host'     => '127.0.0.1',
'username' => 'webuser',
'password' => 'xxxxxxxx',
'dbname'   => 'test'

));

真的就这么简单。然后,您可以创建表类以提供对单个表的快速访问,或者使用 select 和 statement 对象进行更高级的连接查询。

此外,使用 Zend 框架,您不必使用整个堆栈,如果您愿意,可以只使用 DB 组件。

如果您不想为此使用 Zend 框架,我强烈建议您考虑替代方案,例如像 Doctrine 这样的 ORM,而不是编写自己的数据库抽象。你很快就会变成一个怪物,而且 ORM 或 Zend 框架有很多开发人员在压缩错误,甚至更多地报告那里的任何错误。

【讨论】:

    【解决方案2】:

    是的,你可以像这样传递数据库连接。

    恕我直言,它使编码变得更加困难,但测试却容易得多。

    【讨论】:

      【解决方案3】:

      您将如何使用它:

      class DB {
          private $dbc;
      
          public function __construct($dbConn) {
              $this->dbc = $dbConn;
          }
      
          public function runQuery() {
              mysql_query($query, $this->dbc);
          }
      }
      

      【讨论】:

      • 所以,这个类我可以用这样的注册类注册,只是它不是单例。 /*** 创建数据库注册对象*/ // $registry->db = db::getInstance(); **另外,如果我想运行一个查询,那么查询应该是runquery方法的一个参数,对吧那么结果应该暴露在一个公共变量中,这是怎么做的?
      • include db_connect.php;///// 这将设置全局 $dbc;//////then///// $registry->db = new DB($dbc); ***** 然后,我创建了一个全局变量和一个对象。就做事而言,这很好吗?**另外,显然,我不能再使用触发错误,我应该@suppress 来自查询的任何错误吗?
      • 我就是这样做的。我不会压制错误,至少在开发中是这样。开发完成后,您可以@suppress错误并提供更多用户友好的错误消息。
      【解决方案4】:

      传递变量。单身人士名声不好是有原因的——他们是为了解决一个非常具体的问题而发明的,而且他们甚至没有做得特别好。不要将它们用作避免传递变量的方法,应该这样做。

      【讨论】:

        【解决方案5】:

        我为此使用了一个单例类,但我仍然通过全局变量传递我的类变量。

        首先创建单例类的原因是为了确保只创建一个类的实例。在这种情况下,我想确保只创建一个数据库实例。通过将类放置为单例类,任何编写与该类接口的代码的人都将获得相同的连接。但是,它仍然不能替代全局变量。

        对于 Singleton 类,这里是一个例子:

        类数据库 { 静态 $class= 假; 静态函数 get_connection() { 如果(自我::$class== 假) { self::$class= 新数据库; } 别的 { 返回自我::$类; } } // 这将确保它不能被再次创建。 受保护的函数 __construct() { $this->connection = mysql_connect(); } 公共功能查询($查询) { 返回 mysql_query($query, $this->connection; } } $object = 数据库::get_connection();

        我这样做而不是简单地绕过连接的主要原因纯粹是因为我不想一遍又一遍地重复代码。因此,将我的查询、连接和各种其他 DB 函数放在同一个类中可以节省时间。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2023-01-30
          • 1970-01-01
          • 2019-09-16
          • 1970-01-01
          • 2018-08-04
          • 2018-08-07
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多