在php类中加载pdo对象

在php类中加载pdo对象,php,pdo,Php,Pdo,我有一个数据库连接(PDO)文件。由于PDO是一个类(库)或其他什么,我觉得不需要数据库类(或者我应该构建一个数据库类吗?)无论如何,我想加载PDO对象,这样我就可以在另一个类中使用函数,但我不确定如何做 pdo_object.php //single php db connection file here.. $dbh = ... class User { function login() { //do pdo query here... } } u

我有一个数据库连接(PDO)文件。由于PDO是一个类(库)或其他什么,我觉得不需要数据库类(或者我应该构建一个数据库类吗?)无论如何,我想加载PDO对象,这样我就可以在另一个类中使用函数,但我不确定如何做

pdo_object.php

//single php db connection file here..
$dbh = ...
class User {
    function login()
    {
        //do pdo query here...
    }
}
user.php

//single php db connection file here..
$dbh = ...
class User {
    function login()
    {
        //do pdo query here...
    }
}
我是否需要在每个需要数据库连接的类上注入
$dbh


“我不明白你的问题。在用户->登录()中,只需输入你的PDO即可。” 逻辑。“-我不需要在类中以某种方式加载dbh吗

没有一个单一的答案!如果您的类要执行逻辑(实际上是执行mysql_查询),那么您必须提供连接处理程序

另一方面,您的类不执行查询,但执行一些类似的任务:构建查询、应用逻辑、检查用户提供的查询数据是否正确等,然后无需加载处理程序,因为其他类将需要它

我仍然相信这些问题(关于设计)是非常棘手的,哲学的,一般的等等,除非它们是非常具体的,而你的问题并不是那么多

由于PDO是一个类(库)或其他什么,我觉得不需要 一个数据库类(或者我应该构建一个吗?)

在实践中,我们确实构建了一个数据库类,不仅仅是为了将pdo处理程序放在那里,而是因为有太多的东西可以预先定义并对您有很大帮助。 您可能有多个数据库处理程序(例如,一个供公共使用,另一个供内部使用),您可能有自己的方法从旧项目中检查这一点:

public  function getValueLike($dbh, $table,$col_name, $value )
    {     

                $col_name = '`'. $col_name . '`';
                $sql = 'SELECT '. $col_name .' FROM '. $table .' where  '. $col_name ." like ? limit 2" ;

            //prepare,execute
            $stmt =  $dbh->prepare($sql );
            $stmt->execute(array('%'.$value.'%'));

            //we want it is an array with int keys
            $stmt->setFetchMode(PDO::FETCH_NUM); 
            $tmp =   $stmt->fetchAll(); //get all values

            $res[] = $tmp[0];//get the first value
            $res[] = count($tmp);//get the count

            //return the 1st value found, also the count which at most can be 2 
            return  $res ; 
    }
所有这些东西,包括用户名、密码、数据库服务器等,在一个容易访问的类下,在一个地方(而不是分散在一起),可以应用访问限制等,这不是很好吗?这些都是证明我观点的论点

如果您决定构建一个类,那么在一开始只调用该类一次,然后只传递对象

  • 选择MVC,选择一个好的,它的结构大部分是预定义的,它会迫使你应用一些很酷的东西,使你成为一个更好的程序员

  • 至于数据库处理程序,我建议至少将其设置为单例(静态对象),并在需要时传递对象。更好的解决方案是使用注册表的非静态方式。您只需将注册表对象传递到某个位置,就可以访问所需的所有内容。如果您不能进入MVC,只需尝试构建一个自定义注册表,它将节省大量时间。 有很多很好的教程


我不明白你的问题。在
User->login()
中,只需输入您的PDO逻辑。这个问题有助于了解您想做什么的细节。。。你是在问是否应该使用Data Mapper vs Active record,还是应该依赖注入PDO db句柄而不是通过函数中的全局单例加载它?很抱歉,是的,我的意思是“Active record,或者您是在问是否应该依赖注入PDO db句柄,而不是通过函数中的全局单例加载它?”“我不理解您的问题。在User->login()中,只需放入您的PDO逻辑。“-我不需要在类中以某种方式加载dbh吗?