使用php从类对象中获取数据库查询

时间:2009-07-25 08:01:51

标签: php database design-patterns oop class

我的问题是:

我还可以在这样的对象中进行查询:

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

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

还是有更好的方法吗?

为数据库连接创建单例类,但是 我看到人们正在写一些关于否定性的消极情绪。

我是制作物品的新手,所以我不知道我是否可能必须这么做 不同,我的意思是db。

谢谢,理查德

5 个答案:

答案 0 :(得分:1)

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

它们还包括一种将适配器设置为默认值的方法,使其成为执行操作的快捷方式。

除此之外,Zend_Db默认使用参数化查询而不是旧式引用查询,从而增加了安全性,让您高枕无忧。

使用全局变量几乎是一个坏主意,它太容易意外覆盖一个!以及所有其他原因,你会发现没有使用快速谷歌。

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

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

));

真的很简单。然后,您可以使表类提供对各个表的快速访问,或者使用select和statement对象来获得更高级的连接查询。

此外,使用Zend Framework,您不必使用整个堆栈,只需使用数据库组件即可。

如果您不想为此使用Zend Framework,我强烈建议您考虑使用像Doctrine这样的ORM而不是编写自己的数据库抽象。你很快会得到一个怪物,ORM或Zend框架有很多开发人员压缩bug,甚至更多地报告那些。

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

以下是您将如何使用它:

class DB {
    private $dbc;

    public function __construct($dbConn) {
        $this->dbc = $dbConn;
    }

    public function runQuery() {
        mysql_query($query, $this->dbc);
    }
}

答案 3 :(得分:0)

传递变量。单身人士有一个不好的名声是有原因的 - 他们被发明来解决一个非常具体的问题,他们甚至没有那么特别好。不要将它们用作避免传递变量的方法,这就是应该如何完成的。

答案 4 :(得分:0)

我为此目的使用单例类,但我仍然通过globals传递我的类变量。

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

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

 class datbasebase
   {
    static $class = false;
    static function get_connection()
    {
        if(self::$class == false)
        {
            self::$class = new database;
        }
        else
        {
            return self::$class;
        }
    }
    // This will ensure it cannot be created again.
    protected function __construct()
    {
                $this->connection = mysql_connect();
    }
        public function query($query)
        {
                return mysql_query($query, $this->connection;
        }
   }

   $object = database::get_connection();

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