数据库查询';使用php从类对象中删除

数据库查询';使用php从类对象中删除,php,database,design-patterns,oop,class,Php,Database,Design Patterns,Oop,Class,我的问题是: 我仍然可以从如下对象中执行查询: $result = mysql_query ($q,$dbc) or trigger_error("Query: $q\n<br />MySQL Fout: " . mysql_error($dbc)); $result=mysql\u查询($q,$dbc) 或 触发器_错误(“查询:$q\nMySQL Fout:“.MySQL_错误($dbc)); 通过将全局dbconnection变量

我的问题是:

我仍然可以从如下对象中执行查询:

$result = mysql_query ($q,$dbc) 
          or 
          trigger_error("Query: $q\n<br />MySQL Fout: " . mysql_error($dbc));
$result=mysql\u查询($q,$dbc)
或
触发器_错误(“查询:$q\n
MySQL Fout:“.MySQL_错误($dbc));
通过将全局dbconnection变量$dbc传递给构造函数

还是有更好的办法

或者为数据库连接创建单例类,但是 我看到了很多人们正在写的关于它的负面情绪

我对制作物体还不熟悉,所以我不知道我是否需要做一点 不同,我是说db


谢谢,Richard是的,你可以这样传递数据库连接


IMHO使编码变得更难,但测试变得更容易。

以下是您将如何使用它:

class DB {
    private $dbc;

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

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

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

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

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

对于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(); 类datbasebase { 静态$class=false; 静态函数get_connection() { if(self::$class==false) { self::$class=新数据库; } 其他的 { 返回self::$class; } } //这将确保不能再次创建它。 受保护函数_u构造() { $this->connection=mysql_connect(); } 公共函数查询($query) { 返回mysql\u查询($query,$this->connection; } } $object=database::get_connection();

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

< P>如果你在寻找数据库抽象,为什么不考虑使用Zend Fra提供的DB类呢?我的工作

它们还包括将适配器设置为默认适配器的方法,使其成为执行操作的快照

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

使用globals是一个非常糟糕的主意,它太容易意外地覆盖一个!以及所有其他的原因,你会发现没有使用他们与快速谷歌

与Zend Framework建立db连接非常简单

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

其实就这么简单。然后,可以使表类提供对单个表的快速访问,也可以使用select和语句对象进行更高级的联接查询

此外,使用Zend Framework,您不必使用整个堆栈,只要使用DB组件即可


如果您不想使用ZEngFramework,我强烈建议您考虑ORM类原则来替代编写自己的DB抽象。你很快就会遇到一个怪物,ORM或Zend框架会有很多开发人员在处理bug,甚至会有更多的人报告存在的bug。

所以,我可以向这样的registryclass注册这个类,只是它不是一个单例。/**创建数据库注册表对象*//$registry->db=db::getInstance()**另外,如果我想运行一个查询,那么该查询应该是runquery方法的一个参数,对吧,那么结果应该在一个公共变量中公开,那么这就是如何完成的吗?包括db\u connect.php;///这将设置全局$dbc//////然后//$registry->db=newdb($dbc);****然后,我创建了一个全局变量和一个对象。就做事情而言,这好吗?**而且,显然,我不能再使用触发器错误,我是否应该@suppress任何来自查询的错误?我就是这样做的。我不会抑制错误,至少在开发中是这样。开发完成后,您可以@抑制错误并提供更友好的错误消息。该死,我真想知道他决定做什么。。。