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

Php 处理数据库查询的最佳方法是什么,php,mysql,database,database-design,Php,Mysql,Database,Database Design,我确信我目前所做的不是最优的,但我真的很想听听关于如何处理web应用程序上的所有db查询(包括连接字符串)的一些意见 目前,我有一个classes目录,其中每个类都有一个文件,我还有另一个名为db的目录,其中包含一个conn.php,它有连接字符串,db目录上的其他文件与classes目录中的类似,每个类一个,但用于处理mysql查询 因此,基本上我在一个文件中有每个类的所有db查询,每当我需要从类文件中查询某些内容时,我调用db文件上的函数 我将每个db文件包括在相应的db文件中,例如在use

我确信我目前所做的不是最优的,但我真的很想听听关于如何处理web应用程序上的所有db查询(包括连接字符串)的一些意见

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

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

我将每个db文件包括在相应的db文件中,例如在user.class.php文件中,您将发现include'db/user.db.php'

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

user.class.php:

user.db.php:

conn.php:

你是如何处理的?

使用。只要验证输入并防止注入攻击,您所做的工作听起来比原始SQL行更好

流行的PHP框架,比如已经被公开审查的PHP框架,掩盖了很多你最终可能自己做的事情


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

对于小型项目,我使用非常简单的php类


对于更大的应用,请使用数据库抽象层。

通过将域层与数据库访问层分离,您已经做了正确的事情。但是你把它组合起来的方式可以改进。看看TDG模式

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

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

TDG的另一个替代方案是

有一个很好的TDGs介绍,其中有一个Zend框架示例

行数据网关的和


听起来不错。您正在将Db访问与域类分离。那你怎么把它们组合起来呢?你能展示一下你的User和UserDb类中的一些代码片段吗?添加了一些代码片段,我觉得它看起来不太优雅。我还被告知,我应该为每个查询打开一个到数据库的连接,为什么?我做的项目越多,我就越得出结论,数据库抽象层在大多数情况下是毫无意义的。诚然,只需学习一个API而不必学习所有现有的db供应商扩展是很方便的。但话说回来,它们也不难理解,而且通常提供了更大的灵活性。我从来没有改变过实际的数据库,所以这个参数不起作用。我最近不得不改变我的数据库,Oracle买下了MySQL,改变了重新分发许可条款,当我搬到postgres时,DBAL真的救了我。DBAL会增加复杂性,而且确实感觉像是在进行培训。然而,我并不孤单,我觉得它们比你花费的要多,尤其是在考虑安全性、灵活性和干燥性的时候。我想这取决于你需要多少DB供应商特定的代码特性。在一个项目中,我们不得不将大量特定于oracle的SQL填充到查询中,因此选择DAL来处理DB基本上没有意义。既然他们付了神知道多少钱的许可证,他们也不会很快改变。在那个项目中,我们只使数据库访问速度慢了一点,几乎没有获得任何优势。应该直接使用OCI扩展。
include('db/user.db.php');
class User {
    public $fname;
    public $userid;

    function __construct($userid) {
        $this->user_id = $userid;
        $this->fname = DB_GetFirstName($userid);
        }
}
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 = mysql_connect("localhost", "user", "pass");
mysql_select_db("dbname", $conn);
$result = $db->q("select * from `users`limit 3");

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