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

使用PDO数据库类而无需每次都创建新连接?

姚凯歌
2023-03-14
问题内容

我有这个PDO数据库类

class clsDatabase{
  // db settings
  private $host   = 'localhost';
  private $user   = 'test';
  private $dbname = 'test';
  private $pass   = 'test1';

  private $dbh;
  private $error;

  public function __construct(){
        // Set DSN
        $dsn = 'mysql: host=' . $this->host . ';dbname=' . $this->dbname;
        // Set options
        $options = array(
            PDO::ATTR_PERSISTENT            => true,
            PDO::ATTR_ERRMODE               => PDO::ERRMODE_EXCEPTION,
            PDO::MYSQL_ATTR_INIT_COMMAND    => 'SET NAMES UTF8'
        );
        // Create a new PDO instanace
        try{
            $this->dbh = new PDO($dsn, $this->user, $this->pass, $options); 
        }
        // Catch any errors
        catch(PDOException $e){
            $this->error = $e->getMessage();
            echo $this->error;
            exit;
        }       
    }

    public function query($query){
        $this->stmt = $this->dbh->prepare($query);
    }
}

我尝试将代码分成不同的类,例如,我有一个连接到clsUserController的clsDBUser。我这样做是为了知道什么类使用什么数据库代码。我的clsDBUser类看起来像这样

class clsDBUser extends clsDatabase {
    // construct
    public function __construct() {
        parent::__construct();
    }

    // get users
    public function getUsers($users_id){
        $query = "
            SELECT 
                email
            FROM 
                users
            WHERE 
               users_id = :users_id
        ";          
        $this->query($query);
        $this->bind(':users_id', $users_id);

        if($row = $this->single()){
            $this->close();
            return $row;
        }
        $this->close();
        return false;       
    }
}

我想知道这是否可行,还是我现在在每个类中创建一个新的数据库连接?因为通常在PHP4中(是的,我知道很旧),我无法识别我每次都必须建立一个新的数据库连接。

我需要改进吗,我需要如何改进呢?


问题答案:

您应该走空先生的答案中所示的道路。简而言之:

  1. 摆脱clsDatabase。
  2. 创建一个PDO实例。
  3. 像mr.void的答案所示,将其传递到clsDBLogin的属性中。
  4. 然后以$ this-> db-> prepare()的形式使用此pdo实例,依此类推

所以应该像

class clsDBLogin
{
    public function __construct($db)
    {
        $this->db = $db;
    }

    public function validateLogin($email)
    {  
        $email = trim($email);

        // Check user in db to start verification
        $query = 'SELECT * FROM users u, users_info ui 
                  WHERE u.users_id = ui.users_id AND u.email = ?';
        $stmt = $this->db->prepare($query);
        $stmt->execute([$email]);
        return $stmt->fetch();
    }
}

$dsn = 'mysql: host=localhost;dbname=test;charset=utf8';
$options = array(
        PDO::ATTR_PERSISTENT            => true,
        PDO::ATTR_ERRMODE               => PDO::ERRMODE_EXCEPTION,
);
// Create a new PDO instanace
$pdo = new PDO($dsn, $this->user, $this->pass, $options);

$DBLogin = new clsDBLogin($pdo);
$user = $DBLogin->validateLogin($email);


 类似资料:
  • 本文向大家介绍PHP使用PDO连接ACCESS数据库,包括了PHP使用PDO连接ACCESS数据库的使用技巧和注意事项,需要的朋友参考一下 1,参考W3CSHOOL http://www.w3cschool.cc/php/php-pdo.html 2,连接access 以上就是简单的实用php的pdo方式连接ACCESS数据库的方法了,希望大家能够喜欢。

  • 问题内容: 我希望能够使用现有的测试数据库来运行我的测试,而又不想让Django在每次运行测试时都创建和删除数据库。这可能吗? 问题答案: 有可能,这是一种方法: 1)定义自己的测试跑步者,看看这里如何。 2)为了让您的自定义测试运行器查看默认的测试运行器,您可以复制并粘贴代码,然后注释以下行:负责销毁测试数据库,我认为您应该尝试一下该行,但要注意的是像这样: 3)将set.py中的TEST_RU

  • 我使用Eclipse数据库开发视角手动创建了一个模式和几个表。但是每当我试图从代码访问表时,我都会得到“架构不存在”错误。但是,如果我在使用这些表之前在程序中创建这些表,一切都会顺利。每次连接到数据库时都必须创建表吗?因为,我正在测试我的代码,我必须多次重启项目。

  • 问题内容: 作为MySQL的新手,我已经安装了最新版本的MySQL Workbench(5.2.33)。我想知道如何使用此应用程序创建数据库。在SQL编辑器的“概述”选项卡中,几乎没有显示“ MySQL模式”,这些模式是现有数据库吗? 问题答案: 启动MySQL Workbench。 在欢迎窗口的左窗格中,在“打开连接以开始查询”下选择要连接的数据库。 查询窗口将打开。在其左窗格上,有一个标题为“

  • 问题内容: 我想创建一个使用PDO与MySQL交互的类。我可以使用PDO创建一个新的MySQL表吗? 问题答案: 是的你可以。 该部分是PDO构造函数的第一个参数,不必具有数据库名称。您可以简单地使用。然后,如果您具有适当的特权,则可以使用常规SQL命令创建数据库和用户等。 以下是install.php的示例,它以root用户身份登录,创建一个数据库,一个用户,并向用户授予对新创建的数据库的所有特

  • 问题内容: 使用SQLAlchemy,将创建一个Engine对象,如下所示: 如果to参数(在这种情况下为)中指定的数据库不存在,则访问将失败。如果指定的数据库不存在,是否可以告诉SQLAlchemy创建一个新数据库? 问题答案: 在postgres上,通常默认情况下存在三个数据库。如果您能够以超级用户身份(例如,角色)进行连接,则可以连接到或数据库。默认的pg_hba.conf只允许名为unix