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

时间:2011-01-17 14:46:56

标签: php mysql database database-design

我确定我目前正在做的不是最佳,但我真的希望听到一些关于如何处理包括连接字符串在内的Web应用程序上的数据库查询的意见。

目前,我有一个classes目录,每个类都有一个文件,我有另一个名为db的目录,其中包含一个conn.php,其中包含连接字符串和另一个db目录中的文件与classes目录中的文件类似,每个类一个,但是处理mysql查询。

所以基本上我在一个文件中每个类都有所有数据库查询,每当我需要从类文件中查询某些东西时,我都会调用db文件中的函数

我将每个db文件包含在相应的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);

你是如何处理的?

3 个答案:

答案 0 :(得分:3)

使用Database Abstraction Layer。你做的事情听起来比原始SQL行更好,只要你验证输入并防止注入攻击。

流行的PHP框架,例如Doctrine2 have built-in database abstraction layers,已被公开审查并涵盖了很多你可能最终会做的事情。

我建议在创建自己的开源层之前使用如上所述的开源层,因为已经为您准备了非常可靠的代码库。不要重新发明轮子。如果您看到一个缺点,请考虑改进项目。

答案 1 :(得分:1)

对于小型项目,我使用非常简单的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>';
}

更大程度地使用数据库抽象层。

答案 2 :(得分:1)

通过将域层与数据库访问层分离,您已经做了正确的事情。但是你把它放在一起的方式可以改进。看看Table Data Gateway(TDG)模式。

在Table Data Gateway模式中,一个类封装了对特定表的所有访问权限。这有点像你的User.Db.php,区别在于TDG是一个实际的类。您可以将任何相关的数据库访问权限分组到该特定类中,而不是一堆函数。这样做的直接好处是,您可以将实例传递给任何需要它的类,而不是将函数调用硬编码到它们中。

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

TDG的替代方案是Row Data Gateway pattern

上有一个很好的TDG介绍(使用Zend Framework示例)

和行数据网关