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