如何在PHP上使用DAL

时间:2013-05-26 13:50:44

标签: php mysql sql

您好我有一个代码,他们用它来连接数据库

$db= DAL::get_instance();           

$count=$db->read_single_column("select count(id) from ".TABLE_PREFIX."users where email=? and status=1", array($email));
 echo "Aqui".$count;

我为该网站创建了一个空白的新页面,但我认为$db= DAL::get_instance();不起作用..我不想创建多个数据库连接,所以我如何在PHP上使用DAL以便我可以使用相同的链连接...

DAL在哪里以及如何设置? (我如何搜索设置的字符串,格式是什么)

由于

我在库核心上找到了一个DAL.php ..但是它是用Ioncube编写的..所以我的猜测是我无法看到如何设置:(

1 个答案:

答案 0 :(得分:2)

您的DAL类是用户空间定义的 - PHP中没有这样的东西。将它的整个代码发布到某个地方,有人可能会告诉你如何处理它。

但是,我会基于你所说的内容提供泛型。 static::get_instance()并提到您无法触发多个实例,这表明您的数据库抽象层实际上是Singleton。这很好,然后再次,这是非常糟糕的。 Singleton的整个目标是将类限制为一个实例,这对于数据库层来说非常好。

但是,在您的情况下,您似乎希望同时连接到多个DB。根据代码的编码方式,您可以在几乎不修改代码的情况下执行此操作。

供参考,这是您的DAL的简化版本:http://codepad.viper-7.com/gPQ8bo。我保留了你所关注的部分并剥夺了其他所有东西。

显而易见的方式

撕掉单例并开始使用依赖注入。

不那么明显的方式

您可以使用Reflection重置Singleton的私有静态成员。 这是一个黑客,所以只有在必要时才使用。

这方面的小提琴在于:http://codepad.viper-7.com/ja6zHL。代码如下:

$reflection = new \ReflectionProperty('MySingleton', 'instance'); // Get a handle to the private self::$instance property
$reflection->setAccessible(true); // Set it to public
$reflection->setValue(null, null); // Modify it
// Optional: re-restrict it
$reflection->setAccessible(false);

请注意,这有三个原因:

  • 你不应该这样做。相反,您应该考虑使用实际上允许您触发多个连接或自己制作一个连接的DAL
  • 这使用了Reflection,它具有非常大的性能影响
  • 这是一个黑客。您也失去了第一个数据库连接,因此您需要额外的内务管理。