繁体   English   中英

什么是处理数据库查询的最佳方法

[英]What is the best approach to handling db queries

我确定我当前所做的并不是最佳选择 ,但是我真的很想听听您关于如何处理Web应用程序上所有数据库查询(包括连接字符串)的意见。

目前,我有一个classes目录,其中每个类都有一个文件,并且我还有另一个名为db目录,其中包括一个具有连接字符串的conn.php ,而db目录中的其他文件就像在classes目录中一样。对于每个类,但要处理mysql查询。

因此,基本上我在一个文件中拥有每个类的所有数据库查询,并且每当需要从类文件中查询某些内容时,我都会在db文件中调用该函数

我将每个数据库文件都包含在相应的数据库文件中,例如,在user.class.php文件中,您会发现include('db/user.db.php')

另外,我将conn.php文件包含到每个db文件中。

user.class.php

include('db/user.db.php');
class User {
    public $fname;
    public $userid;

    function __construct($userid) {
        $this->user_id = $userid;
        $this->fname = DB_GetFirstName($userid);
        }
}

user.db.php

include('conn.php');
function DB_GetFirstName($userid) {
    $result = mysql_fetch_array(mysql_query("SELECT USR_FName FROM users WHERE USR_ID = '$userid'"));
    return $result[0];
}

conn.php

$conn = mysql_connect("localhost", "user", "pass");
mysql_select_db("dbname", $conn);

您如何处理?

使用数据库抽象层 只要您正在验证输入并防止注入攻击,完成的操作听起来比原始SQL行更好。

流行的PHP框架(例如Doctrine2)具有内置的数据库抽象层 ,这些已受到公众审查,并且掩盖了许多您可能最终会自己做的事情。

我建议在创建自己的代码之前使用如上所述的开源层,因为已经为您量身定做了非常坚实的代码库。 不要重新发明轮子。 如果发现不足之处,请考虑改进该项目。

对于小型项目,我使用非常简单的php类http://code.google.com/p/edb-php-class/

$result = $db->q("select * from `users`limit 3");

foreach($result as $a){
        echo $a['name'].' '.$a['surname'].' '.$a['email'].' '.$a['country'].'</br>';
}

对于更大的用途,数据库抽象层。

通过将域层与数据库访问层分离,您已经在做正确的事情。 但是,您将其组合在一起的方式可能会得到改善。 看一下表数据网关 (TDG)模式。

在表数据网关模式中,一个类封装了对特定表的所有访问。 这有点像您的User.Db.php,不同之处在于TDG是实际的类。 您可以将所有相关的db访问权限分组到该特定类中,而不是一堆函数。 这具有直接的好处,您可以将实例传递给需要它的任何类,而不必对其中的函数调用进行硬编码。

每当需要使用特定表时,都可以使用TDG从中获取/修改表中的行。 然后,您可以使用返回的记录集。 或使用DataMapper将记录集中的数据映射到您的Domain类(例如,User类)上。 对于简单的DataMappers,您可以自己制作。 一旦变得更加复杂,最好使用现有的ORM。

TDG的替代方法是行数据网关模式

可以在以下位置很好地介绍TDG(以Zend Framework为例)。

和行数据网关

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM