当前位置: 首页 > 面试题库 >

在课堂上使用PDO

朱锐
2023-03-14
问题内容

我有一些类可以执行一些MySQL查询和准备好的语句。但是,我不知道如何在这些类中合并我的PDO对象。例如,我想做这样的事情:

<?php

$dbh = new PDO(...);

class Foo extends PDO {
    public $dbh;

    public function bar() {
        $this->dbh->prepare('SELECT * FROM table');
        $this->dbh->execute();

    }
}


?>

不幸的是,它不起作用。有人可以建议一种优雅的方法吗?谢谢你的时间。抱歉,我是新手,如果您不清楚任何事情,请留下任何评论,我会尽力答复!


问题答案:

您可以在实现单例模式的类中实例化与数据库的连接。连接将完成一次,所有其他对象/脚本都可以轻松访问该类。

在下面的示例中,我使用称为“ Core”的类;

class Core
{
    public $dbh; // handle of the db connexion
    private static $instance;

    private function __construct()
    {
        // building data source name from config
        $dsn = 'pgsql:host=' . Config::read('db.host') .
               ';dbname='    . Config::read('db.basename') .
               ';port='      . Config::read('db.port') .
               ';connect_timeout=15';
        // getting DB user from config                
        $user = Config::read('db.user');
        // getting DB password from config                
        $password = Config::read('db.password');

        $this->dbh = new PDO($dsn, $user, $password);
    }

    public static function getInstance()
    {
        if (!isset(self::$instance))
        {
            $object = __CLASS__;
            self::$instance = new $object;
        }
        return self::$instance;
    }

    // others global functions
}

该类从名为“ Config”的静态类中获取参数,您可以在其中存储配置:

<?php
class Config
{
    static $confArray;

    public static function read($name)
    {
        return self::$confArray[$name];
    }

    public static function write($name, $value)
    {
        self::$confArray[$name] = $value;
    }

}

// db
Config::write('db.host', '127.0.0.1');
Config::write('db.port', '5432');
Config::write('db.basename', 'mydb');
Config::write('db.user', 'myuser');
Config::write('db.password', 'mypassword');

在所有脚本/对象中,您只需要获取Core的实例,然后查询数据库

$sql = "select login, email from users where id = :id";

try {
    $core = Core::getInstance();
    $stmt = $core->dbh->prepare($sql);
    $stmt->bindParam(':id', $this->id, PDO::PARAM_INT);

    if ($stmt->execute()) {
        $o = $stmt->fetch(PDO::FETCH_OBJ);
        // blablabla....

如果您需要有关单例的更多信息,请查看PHP文档http://php.net/manual/en/language.oop5.patterns.php



 类似资料:
  • 问题内容: 我有很多线程的应用程序。其中之一是烧瓶,用于实现(辅助)API。它使用时负载低,并且永远不会暴露在Internet上,因此内置flask Web服务器非常好。 我当前的代码如下所示: 我觉得我做错了,因为所有文档都说“在模块级别创建flask应用程序”。但是我不想这样做- 它与我的测试弄混了,并且API只是大型应用程序的一小部分,该应用程序具有自己的结构和协议(每个“应用程序”都是在一

  • Scala课堂是Twitter启动的一系列讲座,用来帮助有经验的工程师成为高效的Scala 程序员。Scala是一种相对较新的语言,但借鉴了许多熟悉的概念。 因此,课程中的讲座假设听众知道这些概念,并展示了如何在Scala中使用它们。我们发现这是一个让新工程师能够快速上手的有效方法。网站里的是伴随这些讲座的书面材料,这些文字材料本身也是很有用的。 方法 我们认为最有意义的教学方式是,不要把Scal

  • 问题内容: 如果一个类实现了另一个类,那是什么意思?我找到了以下代码示例:http : //www.java2s.com/Code/Php/Class/extendsandimplement.htm 但不幸的是,它没有任何解释… 问题答案: 实现是指它采取接口指定的指定 行为 。考虑以下接口: 无论是和类实现的接口。 接口的优点在于,我们现在可以通过接口引用此类的实例。考虑以下示例: 该循环的输出

  • 问题内容: 我正在使用登录功能,但是遇到了我无法弄清的错误。 这是我的模型登录类: 最后一个函数给出错误“ 在类中找不到方法’close’ ”,“ 在主题类中找不到引用的方法。 ” 这是我的数据库类: 路径是正确的,事实并非如此。可能是什么错误? 问题答案: PhpStorm无法确定您的字段是什么类型。您可以通过简单的PHPDoc注释提供typehint来提供帮助:

  • 当一个类必须有某种对象的容器(集合)时,有几种选择,我想知道我更喜欢哪种实现。 以下是我找到的选项: 优点:AClass不依赖于集合的具体实现(在本例中为列表)。 缺点:AClass没有添加和删除元素的接口 优点:与IEnumerable相同,并且具有添加和删除元素的接口 缺点:ICollection接口定义了很少使用的其他方法,仅仅为了接口而实现这些方法是很无聊的。IEnumerable LIN

  • 问题内容: 我自己的班级需要什么支持才能打印出来?例如,我有: 类应使用什么方法来使此代码起作用?也许是这样的: 我猜测该方法必须重载。我对吗?这够了吗? 问题答案: 您可以使用来打印任何对象。println的此重载版本将打印出您的对象的表示形式。如果要自定义要打印的内容,则必须重写该方法,例如: 如果不重写该方法,将使用class的默认实现,该实现具有以下形式(类名称和实例哈希码的十六进制表示形