【问题标题】:Simple database abstraction for PHP and MySQLPHP 和 MySQL 的简单数据库抽象
【发布时间】:2012-11-22 19:37:55
【问题描述】:

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

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

感谢您的帮助。

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      RedBeanPHP 对于您所描述的目的来说是一个出色的库。这是我用过的最灵活的 ORM。有关 CRUD 操作,请参阅他们的 home page 上的示例:

      $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()),它还具有简单的调试功能。它作为数据库抽象层非常强大,但如果您不想使用,则不必使用所有花哨的花里胡哨。包含库后,它或多或少是开箱即用的。

      强烈推荐,尤其是为了您的目的。

      【讨论】:

      • 谢谢,这是一个很好的答案。
      猜你喜欢
      • 2019-05-29
      • 1970-01-01
      • 2014-05-26
      • 1970-01-01
      • 2010-12-13
      • 1970-01-01
      • 2013-11-29
      • 1970-01-01
      • 2012-11-22
      相关资源
      最近更新 更多