Php 如何在单独的类中处理与mysql数据库的连接?

Php 如何在单独的类中处理与mysql数据库的连接?,php,mysql,class,pdo,Php,Mysql,Class,Pdo,所以我有一个完整的注册和登录序列,但我必须分别连接到每个序列中的数据库。我正试图使用一个单独的类,我可以简单地包括连接到数据库。我的希望是,这将简化未来需要db连接的页面,并将我的登录信息隐藏到数据库中。这是代码;我保留了旧代码,只是“注释”了它: DBconn dblogin.php registersecure.php 用户名: 密码: 名字: 姓氏: 电邮: 提交 你还没提出问题。但是,我可以看到,您正在对类实例$db进行寻址,就好像它是连接一样,而事实并非如此。您仍然需要

所以我有一个完整的注册和登录序列,但我必须分别连接到每个序列中的数据库。我正试图使用一个单独的类,我可以简单地包括连接到数据库。我的希望是,这将简化未来需要db连接的页面,并将我的登录信息隐藏到数据库中。这是代码;我保留了旧代码,只是“注释”了它:


DBconn
dblogin.php



registersecure.php


用户名:

密码:
名字:
姓氏:
电邮:
提交
你还没提出问题。但是,我可以看到,您正在对类实例
$db
进行寻址,就好像它是连接一样,而事实并非如此。您仍然需要使用getter方法获取受保护的连接属性

$query = $db->getConnection()->prepare($sql); 

你还没提出问题。但是,我可以看到,您正在对类实例
$db
进行寻址,就好像它是连接一样,而事实并非如此。您仍然需要使用getter方法获取受保护的连接属性

$query = $db->getConnection()->prepare($sql); 

你还没提出问题。但是,我可以看到,您正在对类实例
$db
进行寻址,就好像它是连接一样,而事实并非如此。您仍然需要使用getter方法获取受保护的连接属性

$query = $db->getConnection()->prepare($sql); 

你还没提出问题。但是,我可以看到,您正在对类实例
$db
进行寻址,就好像它是连接一样,而事实并非如此。您仍然需要使用getter方法获取受保护的连接属性

$query = $db->getConnection()->prepare($sql); 

您的代码中有错误。 在DBconn类中,constrcut的开头应该有双下划线

下一个错误出现在registersecure.php中

这个
$query=$db->getConnection->prepare($sql)
应该是
$query=$db->getConnection()->prepare($sql)

作为旁注,这不是获取连接实例的正确方法,您应该关闭连接并再次打开它,或者应该为连接处理程序指定一个唯一的名称。我个人编写的db连接处理程序类如下:

class DBQuery {
  protected static $_connections = array();
  protected $_dbh;

  protected function __construct($dbh = null) {
    if (null !== $dbh) {
      $this->_dbh = $dbh;
    } else {
      $this->_dbh = new PDO(
        sprintf("mysql:host=%s;dbname=%s", DBHOST, DBNAME), 
        DBUSER, DBPASS
      );
    }
    $this->_dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  }

  public static function getInstance($config = null) {
    if (null === $config) {
      $hash = "__default__";
      if (!isset(self::$_connections[$hash])) {
        self::$_connections[$hash] = new self();
      }
    } else {
      $hash = sha1(json_encode($config));
      if (!isset(self::$_connections[$hash])) {
        $dbh = new PDO(
          sprintf("mysql:host=%s;dbname=%s", $config->host, $config->name), 
          $config->username, $config->password
        );
        self::$_connections[$hash] = new self($dbh);
      }
    }
    return self::$_connections[$hash];
  }

  public function __call($methodName, $arguments) {
    return call_user_func_array(array($this->_dbh, $methodName), $arguments);
  }

  public function __destruct() {
    $this->_dbh = null; // closes the db connection
  }
}
然后,要从任何其他地方获取新实例,只需将其包含在该文件中

require_once'DBQuery.class.php'

并获取DBQuery的新实例:

$db=DBQuery::getInstance()


您还可以将配置参数(如数据库名称、用户名、密码等)作为数组传递,以便动态连接到其他数据库:)

您的代码中有错误。 在DBconn类中,constrcut的开头应该有双下划线

下一个错误出现在registersecure.php中

这个
$query=$db->getConnection->prepare($sql)
应该是
$query=$db->getConnection()->prepare($sql)

作为旁注,这不是获取连接实例的正确方法,您应该关闭连接并再次打开它,或者应该为连接处理程序指定一个唯一的名称。我个人编写的db连接处理程序类如下:

class DBQuery {
  protected static $_connections = array();
  protected $_dbh;

  protected function __construct($dbh = null) {
    if (null !== $dbh) {
      $this->_dbh = $dbh;
    } else {
      $this->_dbh = new PDO(
        sprintf("mysql:host=%s;dbname=%s", DBHOST, DBNAME), 
        DBUSER, DBPASS
      );
    }
    $this->_dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  }

  public static function getInstance($config = null) {
    if (null === $config) {
      $hash = "__default__";
      if (!isset(self::$_connections[$hash])) {
        self::$_connections[$hash] = new self();
      }
    } else {
      $hash = sha1(json_encode($config));
      if (!isset(self::$_connections[$hash])) {
        $dbh = new PDO(
          sprintf("mysql:host=%s;dbname=%s", $config->host, $config->name), 
          $config->username, $config->password
        );
        self::$_connections[$hash] = new self($dbh);
      }
    }
    return self::$_connections[$hash];
  }

  public function __call($methodName, $arguments) {
    return call_user_func_array(array($this->_dbh, $methodName), $arguments);
  }

  public function __destruct() {
    $this->_dbh = null; // closes the db connection
  }
}
然后,要从任何其他地方获取新实例,只需将其包含在该文件中

require_once'DBQuery.class.php'

并获取DBQuery的新实例:

$db=DBQuery::getInstance()


您还可以将配置参数(如数据库名称、用户名、密码等)作为数组传递,以便动态连接到其他数据库:)

您的代码中有错误。 在DBconn类中,constrcut的开头应该有双下划线

下一个错误出现在registersecure.php中

这个
$query=$db->getConnection->prepare($sql)
应该是
$query=$db->getConnection()->prepare($sql)

作为旁注,这不是获取连接实例的正确方法,您应该关闭连接并再次打开它,或者应该为连接处理程序指定一个唯一的名称。我个人编写的db连接处理程序类如下:

class DBQuery {
  protected static $_connections = array();
  protected $_dbh;

  protected function __construct($dbh = null) {
    if (null !== $dbh) {
      $this->_dbh = $dbh;
    } else {
      $this->_dbh = new PDO(
        sprintf("mysql:host=%s;dbname=%s", DBHOST, DBNAME), 
        DBUSER, DBPASS
      );
    }
    $this->_dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  }

  public static function getInstance($config = null) {
    if (null === $config) {
      $hash = "__default__";
      if (!isset(self::$_connections[$hash])) {
        self::$_connections[$hash] = new self();
      }
    } else {
      $hash = sha1(json_encode($config));
      if (!isset(self::$_connections[$hash])) {
        $dbh = new PDO(
          sprintf("mysql:host=%s;dbname=%s", $config->host, $config->name), 
          $config->username, $config->password
        );
        self::$_connections[$hash] = new self($dbh);
      }
    }
    return self::$_connections[$hash];
  }

  public function __call($methodName, $arguments) {
    return call_user_func_array(array($this->_dbh, $methodName), $arguments);
  }

  public function __destruct() {
    $this->_dbh = null; // closes the db connection
  }
}
然后,要从任何其他地方获取新实例,只需将其包含在该文件中

require_once'DBQuery.class.php'

并获取DBQuery的新实例:

$db=DBQuery::getInstance()


您还可以将配置参数(如数据库名称、用户名、密码等)作为数组传递,以便动态连接到其他数据库:)

您的代码中有错误。 在DBconn类中,constrcut的开头应该有双下划线

下一个错误出现在registersecure.php中

这个
$query=$db->getConnection->prepare($sql)
应该是
$query=$db->getConnection()->prepare($sql)

作为旁注,这不是获取连接实例的正确方法,您应该关闭连接并再次打开它,或者应该为连接处理程序指定一个唯一的名称。我个人编写的db连接处理程序类如下:

class DBQuery {
  protected static $_connections = array();
  protected $_dbh;

  protected function __construct($dbh = null) {
    if (null !== $dbh) {
      $this->_dbh = $dbh;
    } else {
      $this->_dbh = new PDO(
        sprintf("mysql:host=%s;dbname=%s", DBHOST, DBNAME), 
        DBUSER, DBPASS
      );
    }
    $this->_dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  }

  public static function getInstance($config = null) {
    if (null === $config) {
      $hash = "__default__";
      if (!isset(self::$_connections[$hash])) {
        self::$_connections[$hash] = new self();
      }
    } else {
      $hash = sha1(json_encode($config));
      if (!isset(self::$_connections[$hash])) {
        $dbh = new PDO(
          sprintf("mysql:host=%s;dbname=%s", $config->host, $config->name), 
          $config->username, $config->password
        );
        self::$_connections[$hash] = new self($dbh);
      }
    }
    return self::$_connections[$hash];
  }

  public function __call($methodName, $arguments) {
    return call_user_func_array(array($this->_dbh, $methodName), $arguments);
  }

  public function __destruct() {
    $this->_dbh = null; // closes the db connection
  }
}
然后,要从任何其他地方获取新实例,只需将其包含在该文件中

require_once'DBQuery.class.php'

并获取DBQuery的新实例:

$db=DBQuery::getInstance()


您还可以将配置参数(如数据库名称、用户名、密码等)作为数组传递,以便动态连接到不同的数据库:)

啊,我明白了。但是,我仍然收到一个错误:致命错误:在第85行的/home/carlton/public_html/PHPproject/forms/registersecure.php中对非对象调用成员函数prepare(),您能打印$db对象的var_转储吗?您可能在一开始就无法连接,但可能是默默地失败了。此外,请尝试更改include的Required登录名,以确保在尝试实例化DB类时DB类存在。同样的错误