3

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

我正在更新网站。简而言之:它处理用户订阅并跟踪销售(我生产的产品)。我想保留我的选项,以便在不久的将来为其添加新功能。它是使用 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,有人可以根据经验和上述简单的预期用途提供反馈吗?

感谢您的帮助。

4

2 回答 2

3

RedBeanPHP 是用于您描述的目的的优秀库。这是我用过的最灵活的 ORM。有关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()),它还具有简单的调试功能。它作为数据库抽象层非常强大,但如果您不想使用,则不必使用所有花哨的花里胡哨。包含库后,它或多或少是开箱即用的。

强烈推荐,特别是为了您的目的。

于 2012-12-05T04:45:45.040 回答
0

如果您想要一种可移植的方式来访问 PHP 中跨多个数据库后端的数据,请使用内置的 PDO 库。如果您想减少手写 SQL 的数量,您可能需要考虑使用众多 PHP ORM 之一,例如 Doctrine。

于 2012-12-05T02:59:27.797 回答