2012-12-05 18 views
3

这是我第一篇文章,请让我知道是否可以改进问题。针对PHP和MySQL的简单数据库抽象

我正在更新网站。总之:它处理用户订阅并跟踪销售(我制作的产品)。我希望在不久的将来为我们添加新功能。它使用PHP和MySQL构建。

5年来我没有认真地更新过代码,我正在努力抓住机会让整个代码更易于管理和更新。特别是,我试图使数据库与更好的交互。

我打得四处ezSQL这让我在一个非常简洁的方式与数据库交互,如:

$users = $db->get_results("SELECT name, email FROM users"); 
foreach ($users as $user) { 
    // Access data using object syntax 
    echo $user->name; 
    echo $user->email; 
} 

我真的很喜欢它:我很快与一个对象,我可以使用结束和它使代码更好地阅读,而不必像过去那样拥有更多的mysql_ *函数或SQL查询。

如果它是SELECT查询不错,但没有太大的INSERT语句的帮助,我可能最终的代码看起来像这样:

$db->query("INSERT INTO users (name, email, date, hostname, cid, code, email_id, email_date, source, ebook, audiobook) 
          VALUES ('" . $db->escape($user->name) . "', 
             '" . $db->escape($user->email) . "', 
             '" . $db->escape($user->date) . "', 
             '" . $db->escape($user->hostname) . "', 
             '" . $db->escape($user->cid) . "', 
             '" . $db->escape($user->code) . "', 
             '" . $db->escape($user->email_id) . "', 
             '" . $db->escape($user->email_date) . "', 
             '" . $db->escape($user->source) . "', 
             '" . $db->escape($user->ebook) . "', 
             '" . $db->escape($user->audiobook) . "')" 
          ); 

它可能会更糟糕,但它仍然不是那么很高兴通过。对我来说最糟糕的部分是它不像前面的例子那么直截了当。

因此,考虑到如下表结构和PHP对象:

$user = new User(); 
$user->name = 'something'; 
$user->email = '[email protected]'; 
/// etc. 

class User { 
    var $name; 
    var $email; 
    // etc. 
} 

我想一个简单的库,可以让我这样做只是这:

$user->insert(); 

...每个成员匹配与我的数据库中同名的列的类相应地插入数据。

我的问题是:有没有这样的图书馆?如果没有,为什么这是一个坏主意。

我一直在阅读关于MVC,但我认为这是对这个项目的矫枉过正。这会增加无关的复杂性而不是简单。例如,我不需要脚手架,也不需要为我生成默认代码。另外,我不想最终陷入一个对于这样一个简单项目来说太过分的框架。所以我一直很好奇PHP的数据库抽象层(例如:ADOdb,PDO),但我不清楚他们是否主要打算缩短书写代码(我的预期用法)或写作代码为各种数据库更容易。我不介意我的代码只适用于MySQL。我只是为了清晰而不是兼容性而抽象它。

而不是必须测试驱动PHP的每个DAL,有人可能会提供反馈,基于经验和上述简单的预期用途?

谢谢你的帮助。

回答

3

RedBeanPHP是一个出色的库,用于描述您的目的。这是我使用过的最灵活的ORM。看到他们home page的例子为CRUD操作:

$post = R::dispense('post'); 
$post->text = 'Hello World'; 

$id = R::store($post);  //Create or Update 
$post = R::load('post',$id); //Retrieve 
R::trash($post);   //Delete 

这个库是非常灵活,它会实时生成数据库表,所以你不必淤泥与周围的模式。许多人认为这是一个功能 - 我通常关闭它,因为我喜欢手动调整我的表。尽管如此,只需拨打R::freeze()即可禁用该功能。无论如何,确保模式在进入生产之前都是冷冻的。

RedBeanPHP还处理数据库表之间的关系,如果您想查看引擎盖下正在执行的查询(再次调用R::debug()),它具有简单的调试功能。它作为一个数据库抽象层是非常强大的,但是如果你不想使用,你不必使用所有的花哨的花里胡哨的东西。包含图书馆之后,它或多或少地可以开箱即用。

强烈建议,特别是为您的目的。

+0

谢谢,这是一个很好的答案。 –

0

如果您希望以可移植的方式访问PHP中多个数据库后端的数据,请使用内置的PDO库。如果你想减少手写SQL的数量,你可能要考虑使用诸如Doctrine之类的许多PHP ORM之一。