在PHP中设计通用数据库接口

lam*_*mas 11 php mysql design-patterns

我正在为PHP中的Web项目创建一个小框架,所以我不必为每个新网站反复做基础工作.创建第二个CakePHP或Codeigniter并不是我的目标,我也不打算用任何可用的框架构建我的网站,因为我更喜欢使用我自己创建的东西.

当涉及核心结构,请求处理等部分时,我在设计和编码框架方面没有任何问题,但我已经陷入为我的模块设计数据库接口的困难.

我已经考虑过使用MVC模式,但发现对于我这个相当小的项目来说这会有点过分.

所以我面临的确切问题是我的框架模块(viewCustomers例如可能是一个模块)应该如何与数据库交互.

  • 将SQL直接混合到PHP代码中(仍然)是一个好主意吗?(将是"老路":) mysql_query( 'SELECT firstname, lastname(.....)?

  • 我怎样才能抽象出如下的查询?

    SELECT firstname, lastname FROM customers WHERE id=X
    
    Run Code Online (Sandbox Code Playgroud)

MySQL的"助手"功能会不会像

$this->db->customers->getBy( 'id', $x );

是个好主意?

我不太确定,因为在处理更复杂的查询时,例如上面几乎无关紧要的查询,它们往往变得毫无用处.

  • MVC的"模型"模式是解决这个问题的唯一真正选择吗?

  • 您目前用什么来解决上面显示的问题?

Moh*_*san 6

我相信您只想从您的模块访问您的数据库.我会避免直接从代码中使用mysql_query.相反,使用抽象的数据库访问的简单模型将是简单和直接的.

例如,您可以使用以下代码获得类似models/Customers.php的文件:

<?php

class Customers {

    public function getById($id) {
        $sql = "SELECT first_name, last_name FROM customers WHERE id='$id'";
        $res = $DB::getRow($sql);
        return ($res);
    }
}
Run Code Online (Sandbox Code Playgroud)

我假设某种DB帮助程序已经实例化并可用作$ DB.这是一个使用PDO的简单版本.

现在,您应该在模块中包含它并使用以下方式:

<?php

include_once "models/Customers.php";

$customers = new Customers();
$theCustomer = $customers->getById(intval($_REQUEST['cust_id']));


echo "Hello " . $theCustomer['first_name']
Run Code Online (Sandbox Code Playgroud)

干杯.


rom*_*man 5

你有没有看过http://www.doctrine-project.org/或其他php orm框架(想到zend_db)?

  • "高性能MySQL"http://www.mysqlperformanceblog.com/的作者高度劝阻学说和其他人 (2认同)

ave*_*isk 3

如果您需要速度,请使用原始查询(但您实际上应该将 PDO 与准备好的查询一起使用)。

\n\n

如果你想要更多的 OOP,你可以 \xe2\x80\x94as you suggest it\xe2\x80\x94 with helpers 设计这个。

\n\n

有一次,我设计了类似的东西,其概念如下:

\n\n
    \n
  1. DB连接/处理程序类(处理对不同数据库和不同服务器的多重连接,例如MySQL、Oracle等);
  2. \n
  3. 每个操作一个类(即选择、删除等);
  4. \n
  5. 过滤器类(例如RangeFilter);
  6. \n
\n\n

代码看起来像这样:

\n\n
$select = new Select(\'field1\', \'field2\', );\n$result = $select->from(\'myTable\')\n                 ->addFilter(SQLFilter::RangeFilter, \'field2\')\n                 ->match(array(1, 3, 5))\n                 ->unmatch(array(15, 34))\n                 ->fetchAll();\n
Run Code Online (Sandbox Code Playgroud)\n\n

这是一个如何构建它的简单示例。

\n\n

您可以更进一步,实现表关系的自动处理、字段类型检查(对表使用内省)、表和字段别名支持等。

\n\n

这似乎是一项漫长而艰苦的工作,但实际上,完成所有这些功能不会花费您太多时间(\xe2\x89\x881 个月)。

\n