我确定我目前正在做的不是最佳,但我真的希望听到一些关于如何处理包括连接字符串在内的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);
你是如何处理的?
答案 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示例)和行数据网关