PHP和MySQL的简单数据库抽象

时间:2012-12-05 02:36:37

标签: php data-access-layer database-abstraction ezsql

这是我在这里的第一篇文章,如果我能改进这个问题,请告诉我。

我正在更新网站。简而言之:它处理用户订阅并跟踪销售(我制作的产品)。我想保留我的选择,以便在不久的将来为其添加新功能。它是使用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 = 'something@example.com';
/// etc.

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

我想要一个简单的库让我这样做:

$user->insert();

...并将类的每个成员与数据库中的相同名称匹配,并相应地插入数据。

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

我一直在阅读有关MVC的内容,但我认为这个项目太过分了。它会增加额外的复杂性而不是简单性。例如,我不需要脚手架也不需要为我生成默认代码的任何东西。另外,我不想最终纠缠在一个对这么简单的项目来说过多的框架中。

所以我一直很好奇PHP的数据库抽象层(例如:ADOdb,PDO),但我还不清楚它们是否主要是为了缩短编写代码(我的用途)或编写代码为各种数据库更容易。我不介意我的代码只适用于MySQL。我只想简单地抽象它,而不是兼容性。

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

感谢您的帮助。

2 个答案:

答案 0 :(得分: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()),它具有简单的调试功能。它作为数据库抽象层非常强大,但如果你不想,你不必使用所有花哨的花哨。在包含图书馆之后,它或多或少地开箱即用。

强烈推荐,特别是出于您的目的。

答案 1 :(得分:0)

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