我的问题是:
我还可以在这样的对象中进行查询:
$result = mysql_query ($q,$dbc)
or
trigger_error("Query: $q\n<br />MySQL Fout: " . mysql_error($dbc));
通过将全局 dbconnection变量 $ dbc 传递给构造函数
还是有更好的方法吗?
或为数据库连接创建单例类,但是 我看到人们正在写一些关于否定性的消极情绪。
我是制作物品的新手,所以我不知道我是否可能必须这么做 不同,我的意思是db。
谢谢,理查德答案 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();
我这样做的主要原因,而不是简单地传递连接,纯粹是因为我不想一遍又一遍地重复代码。因此,在同一个类中使用我的查询,连接和各种其他数据库函数可以节省时间。