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

2023-11-25

我认为我在理解 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 类(实际上我没有使用自动加载,但我知道它):

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"];
}

问题来了。当我执行此代码时,我收到以下错误消息:

未捕获的错误:调用未定义的方法 Database::prepare()

而且我不确定我是否真正理解导致此错误的原因。

当我更改以下内容时,代码运行良好:

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

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

我的意思是,在构造函数中user.php I've a $this->conn = new Database()由于新的数据库将从数据库类返回我的连接对象,我真的不知道为什么必须有第二个conn->


  • 不要创建诸如您的类之类的类Database类,因为它毫无用处。如果数据库包装器向 PDO 添加一些额外的功能,那么创建数据库包装器就很有意义。但考虑到其当前代码,最好使用普通 PDO。
  • 创建一个single来自普通 PDO 或数据库类的 $db 实例。
  • 将其作为构造函数参数传递进入每个需要数据库连接的类

数据库.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";
}

output:

username_foo
username_bar
username_baz

看看我的(唯一正确的)PDO教程了解更多 PDO 详细信息。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在其他类中使用PDO连接? 的相关文章

随机推荐

  • python中的三重引号

    所以我明白如果我执行以下操作 print Anything I type in here works Multiple LINES woohoo 但是如果下面是我的 python 脚本怎么办 This is my python Script
  • 带有“--enable-shared”标志的奇怪 Python 编译结果

    我正在使用 Debian 附带 Python 2 7 3 尝试从源代码编译 Python 2 7 6 以便与 mod wsgi 和 Apache 一起使用 根据众多答案 显然 在编译 mod wsgi 用法时 您必须使用 enable sh
  • 如何创建对角分割且两半可单击的布局?

    我需要创建一个布局 将屏幕对角线分成两个部分 并以不同的颜色作为背景 像这样的 我怎样才能实现这个目标 这可以按如下方式完成 创建一个FrameLayout 假设 50x50 像素 创建两个ImageViews 在FrameLayout并将
  • 从 Azure Active Directory 获取个人资料图片

    我们已将 Azure AD 设置为应用程序中的身份提供商 我们希望在应用程序中显示应来自 Azure AD 的个人资料图片 为了进行测试 我在 Azure AD 中添加了一个 Windows Live Id 帐户 具有个人资料图片 然后我们
  • 将模型中没有的字段添加到 Django REST 框架中的序列化器

    我有一个模型注释 创建时可能会也可能不会创建新用户 因此 我的 API 在创建新评论时需要密码字段 这是我的评论模型 class Comment models Model commenter models ManyToManyField C
  • 如何使用结构体属性设置默认值?

    我想知道如何将 DefaultValue 属性应用于结构属性 您可以注意到 Microsoft 使用表单的大小和许多其他属性来实现这一点 它们的值的类型是 Size Point 等 我想对我的自定义结构做同样的事情 DefaultValue
  • 如何在Python中获取匹配行之后的行

    我是一个业余爱好者 断断续续地使用 Python 一段时间了 抱歉 如果这是一个愚蠢的问题 但我想知道如果输入文件中的格式如下所示 是否有人知道一种简单的方法来获取一堆行 标题 1 Line 1 Line 2 Line 3 标题 2 Lin
  • 创建忽略鼠标和按键事件的 JavaFX 透明窗口

    我想制作一个 JavaFX 应用程序 基本上用一个覆盖整个用户屏幕Canvas对象 所以基本上我可以在用户屏幕上绘制任何内容 制作一个覆盖整个屏幕的窗口很简单 通过本教程可以使其基本上透明 https assylias wordpress
  • 用Java计算两个日期之间的天数

    我想要一个计算两个日期之间的天数的 Java 程序 输入第一个日期 德语表示法 带空格 dd mm yyyy 输入第二个日期 该程序应计算两个日期之间的天数 如何包含闰年和夏令时 My code import java util Calen
  • 响应式 UI 提示

    当我想创建响应式用户界面时 我只想要一些提示 我知道如何使用 Dispatcher Task BackgroundWorker Threads 我正在寻找更多高级提示 例如绑定提示 当我的 UI 上有 50 多个控件需要更新时 Priori
  • 缺少 python bz2 模块

    我已经安装在我的主目录中 spatel dev1 home spatel python 2 7 3 bin python V Python 2 7 3 我正在尝试运行一个需要 python 2 7 x 版本的脚本 但出现丢失 bz2 错误
  • 可以通过 Apache 下载文件吗?

    Path var lib foo txt 是否可以配置 Apache 以便有一些 HTTP URL 可以启动该文件的下载以及如何配置 Without htaccess file 那么那个 URL 会是什么 localhost var lib
  • Google 云存储 CNAME URL 重定向

    我在 Google Cloud 存储上有一个公共存储桶 wordgamesswf 可以通过网址访问对象http commondatastorage googleapis com wordgamesswf linguistics 我需要托管我
  • 原型还是内联,有什么区别?

    我刚刚学习 Javascript 我想知道是否使用原型声明 如下所示 function TSomeObj this name my object TSomeObj prototype showname function alert this
  • Pickle 类实例加上定义?

    我怀疑这是一个常见问题 但我还没有找到解决方案 我想要的非常简单 而且在技术上似乎是可行的 我有一个简单的 python 类 我想将它存储在光盘上 实例和定义在一个文件中 Pickle 将存储数据 但不存储类定义 有人可能会说类定义已经存储
  • 如何使 jenkins 在 Windows 批处理命令失败时失败?

    我在 jenkins 中使用一些 Windows 批处理命令 其中每个命令都可能失败 为了使 jenkins 作业在每一步都失败 这些批处理命令如下所示 net use m IP ADDRESS Whatever PASSWORD user
  • 在 Android 中直接将捕获的图像上传到 Cloudinary

    我想捕捉一张图片并直接上传到Cloudinary 我如何知道图片的名称以在上传声明中设置它cloudinary uploader upload nameofthepic Cloudinary emptyMap 这是我的代码 public c
  • 正则表达式捕获两个分隔符内单词的每次出现

    假设我有一长串文本 我想捕获每个单词this是在圆括号内提到的 我怎么能这么做呢 以下模式仅匹配第一个this 忽略之后出现的每一个事件 this g 例如 在以下文本上使用上面的模式 Etiam scelerisque nunc ac e
  • 使用 iText5 for .NET 读取 PDF 文件

    我使用 C 作为编程平台iTextSharp阅读 PDF 内容 我使用下面的代码来读取内容 但似乎是每页读取的 public string ReadPdfFile object Filename string strText string
  • 如何在其他类中使用PDO连接?

    我认为我在理解 OOP 的工作原理方面存在问题 我已经更改了它可以工作的代码 但这不是我认为的正确方式 以下场景 不 我不是自己创建用户登录 它实际上只是为了本地开发人员更好地理解 OOP 我有一个database php 文件 class