当前位置: 首页 > 知识库问答 >
问题:

如何在其他类中使用PDO连接?

司马宏邈
2023-03-14

我想我在理解OOP是如何工作的方面遇到了一个问题。我已经改变了它的工作代码,但它不是我认为的支持方式。下面的场景(不,我不是自己创建一个用户登录,它实际上只是为了让本地开发人员更好地理解OOP):

我有一个database.php文件:

class Database {

    /* Properties */
    private $conn;
    private $dsn = 'mysql:dbname=test;host=127.0.0.1';
    private $user = 'root';
    private $password = '';

    /* Creates database connection */
    public function __construct() {
        try {
            $this->conn = new PDO($this->dsn, $this->user, $this->password);
        } catch (PDOException $e) {
            print "Error!: " . $e->getMessage() . "";
            die();
        }
        return $this->conn;
    }
}

因此,在这个类中,我创建了一个数据库连接,并返回该连接(对象?)

然后我有第二个类,著名的User类(其实我没有在使用autoload,但我知道它):

include "database.php";

class User {
    /* Properties */
    private $conn;

    /* Get database access */
    public function __construct() {
        $this->conn = new Database();
    }

    /* Login a user */
    public function login() {
        $stmt = $this->conn->prepare("SELECT username, usermail FROM user");
        if($stmt->execute()) {
            while($rows = $stmt->fetch()) {
                $fetch[] = $rows;
            }
            return $fetch;
        }
        else {
            return false;
        }
    }
}

这是我的两个类。你看没什么大不了的。现在,不要对函数名login感到困惑-实际上,我只是尝试从数据库中选择一些用户名和用户邮件并显示它们。我试图通过以下方式实现这一点:

$user = new User();
$list = $user->login();

foreach($list as $test) {
    echo $test["username"];
}

问题来了。当我执行这段代码时,我会得到以下错误消息:

未捕获的错误:调用未定义的方法数据库::Prepare()

而且我不确定我是否真的理解了导致这个错误的原因。

当我更改以下内容时,代码工作得很好:

将Database.php中的$conn更改为public而不是private(我认为这很糟糕...?但是当它是private时,我只能在Database类内部执行查询,对吗?那么我应该把所有这些查询都放在Database类中吗?我认为这很糟糕,因为在一个大项目中,它会变得非常大...)

我要做的第二个更改是:将user.php文件中的$this->conn->prepare更改为$this->conn->conn->prepare。我真的不知道为什么。

我的意思是,在user.php的构造函数中,我有一个$this->conn=new Database()并且由于new Database将从DB类返回connection对象,我真的不知道为什么必须有第二个conn->

共有1个答案

邵伟
2023-03-14
  • 您当前的类相当没用。如果数据库包装器为PDO添加了一些额外的功能,那么创建数据库包装器是有意义的。但鉴于其当前代码,最好改用普通PDO。
  • 无论哪种方式,都可以从常规PDO或您的数据库类创建一个$DB实例。
  • 将其作为构造函数参数传递到需要数据库连接的每个类

database.php:

<?php
$host = '127.0.0.1';
$db   = 'test';
$user = 'root';
$pass = '';
$charset = 'utf8';

$dsn = "mysql:host=$host;dbname=$db;charset=$charset";
$opt = [
    \PDO::ATTR_ERRMODE            => \PDO::ERRMODE_EXCEPTION,
    \PDO::ATTR_DEFAULT_FETCH_MODE => \PDO::FETCH_ASSOC,
    \PDO::ATTR_EMULATE_PREPARES   => false,
];
$pdo = new \PDO($dsn, $user, $pass, $opt);

user.php

<?php
class User {
    /* Properties */
    private $conn;

    /* Get database access */
    public function __construct(\PDO $pdo) {
        $this->conn = $pdo;
    }

    /* List all users */
    public function getUsers() {
        return $this->conn->query("SELECT username, usermail FROM user")->fetchAll();
    }
}

app.php

include 'database.php';
$user = new User($pdo);
$list = $user->getUsers();

foreach($list as $test) {
    echo $test["username"],"\n";
}

输出:

username_foo
username_bar
username_baz

查看我的(唯一正确的)PDO教程更多的PDO细节。

 类似资料:
  • 问题内容: 我认为在理解OOP的工作方式方面存在问题。我已经更改了它可以工作的代码,但这不是我认为的正确方法。以下情况(不,我不是自己创建用户登录,实际上只是为了让本地开发人员更好地理解OOP): 我有一个database.php文件: 因此,在此类中,我正在创建数据库连接,然后返回连接(对象?) 然后,我有第二个类,著名的User类(实际上,我没有使用自动加载功能,但是我知道): 那是我的两堂课

  • 我想我在理解OOP是如何工作的方面遇到了一个问题。我已经改变了它的工作代码,但它不是我认为的支持方式。下面的场景(不,我不是自己创建一个用户登录,它实际上只是为了让本地开发人员更好地理解OOP): 我有一个database.php文件: 因此,在这个类中,我创建了一个数据库连接,并返回该连接(对象?) 然后我有第二个类,著名的User类(其实我没有在使用autoload,但我知道它): 这是我的两

  • 我有一个很大的问题,我不知道我是否错过了一些明显的东西或什么,但我不能发现我的错误。我有类SPN、A和B。我重载了2次operator=。我想将A类型或B类型作为参数传递。 它不会抛出任何错误。但是如果我在类B或A中尝试make operator(),则使用参数SPN,如下所示: 它会抛出SPN未命名类型的错误。我甚至不能在A类或B类中创建类SPN对象。也许它不是如何客观编程工作,所以我想得到它,

  • 在Spring Boot应用程序中,我有一个类如下: 我想在其他类ABC中使用上述内容,如: 它抛出找不到XYZ的错误。在编写主方法的类中,我已经有@SpringBootApplication。因此,这将自动在包上启用@ComponentScan。ABC在spring配置文件中创建为bean。我的理解是,由于XYZ是用@service注释的,所以spring会扫描、创建并注册该bean。如何在不使

  • 问题内容: 我对使用MYSQL的PDO有点陌生,这是我的两个文件: 我有一个用于连接数据库的连接类: 我有一个account_info类,用于查询数据库中的数据: 我在index.php页面中都包含了这两个文件: 我只是无法使其正常工作,我没有任何输出,我认为它与示波器有关,但是由于我是PDO和OOP的新手,所以我不知道为什么要修复它的正确方法。提前致谢。 问题答案: 解决方案1 替换为 更换 与

  • 我想用java为一个银行程序写一段代码。我构建了一个person类,并从person类继承了客户和员工。输入图像描述这里我也继承了其他类。完成创建所有类后,如照片所示。我创建了一个接口,并对其扩展了JFrame。我想把那些类与JFrame连接起来。我想要add a customer按钮将信息放入Arraylist并保存它们,当我按下Custmer信息按钮时,我如何获得我使用add customer