如何在其他类中使用数据库连接
How to use database connection in other classes
PHP 编程对我来说很新 - 所以我希望我不要问一些愚蠢的问题。但是,我找不到任何问题的答案:-(
我已将我的数据库连接保存在一个单独的 .php 文件中。假设 "connection.inc.php"
connection.inc.php 看起来如下:
$host = "name.server.com";
$dbname = "foo";
$user = "bar";
$pass = "PaSW0rd";
try
{
$DBH = new PDO("mysql:host=$host;dbname=$dbname",$user,$pass,
array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
}
catch(PDOException $e)
{
...
}
在我的 index.php 中,我会将 connection.inc.php 包含在 'include_once "connection.inc.php"
此外,我有一个名为 house.class.php 的 class,其中我有一个方法 SQL 查询我的数据库。我通过 index.php
中的 'getColor($id, $DBH)' 调用该方法
有没有什么方法可以在不总是将 $DBH 放入调用中的情况下使用该方法?
感谢您的帮助!
您应该从 class 本身而不是在索引文件中获取 $DBH
。然后,您可以使该数据库连接实例可用于 class 广泛地与 class 中的其他方法一起使用,而不必为每个函数重新连接,也不必为每个函数提供连接作为参数。
这方面的一个例子看起来像这样:
house.class.php
<?php
class House{
private $DBH;
function __construct(){
include_once "connection.inc.php";
$this->DBH = $DBH;
}
function getColor($id){
$this->DBH // <---- use it like this instead of your $DBH old variable.
}
}
?>
假设您有一个名为 House
的 class 和 getColor()
方法,并且在您的 index.php
中。您可以在 function/method 中使用关键字 global
,但我强烈反对这样做。示例:
public function getColor(int $id)
{
global $dbh;
//and use it as $dbh
$dbh->prepare(....
}
或者你可以在构造函数中注入它。您的 class 的示例
class House
{
private $dbh;
function __construct($dbh)
{
$this->dbh = $dbh;
}
public function getColor($id)
{
//$this refers to current object context
$this->dbh->prepare.....
}
}
当您实例化 House 对象时,您会将 $DBH
传递给构造函数。您的 index.php
示例:
include_once "connection.inc.php";
$house = new House($DBH);
$house->getColor($id);
尽管如此,我还是建议您查看域驱动设计、工厂和存储库模式以及像 Doctrine 或 Eloquent 这样的 ORM,以更好地了解如何将 application/domain 逻辑与数据库分开。
class Database
{
private $host = "localhost";
private $dbname = "codeignitor";
private $username = "root";
private $password = "";
public $conn;
public function getConnection()
{
$this->conn = null;
try {
$this->conn = new PDO ("mysql:host=" . $this->host . ";dbname=" . $this->dbname, $this->username, $this->password);
$this->conn->exec("set names utf8");
// echo "MySqlConnected";
} catch(PDOException $exception){
echo "Connection error: " . $exception->getMessage();
}
return $this->conn;
}
}
PHP 编程对我来说很新 - 所以我希望我不要问一些愚蠢的问题。但是,我找不到任何问题的答案:-(
我已将我的数据库连接保存在一个单独的 .php 文件中。假设 "connection.inc.php"
connection.inc.php 看起来如下:
$host = "name.server.com";
$dbname = "foo";
$user = "bar";
$pass = "PaSW0rd";
try
{
$DBH = new PDO("mysql:host=$host;dbname=$dbname",$user,$pass,
array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
}
catch(PDOException $e)
{
...
}
在我的 index.php 中,我会将 connection.inc.php 包含在 'include_once "connection.inc.php"
此外,我有一个名为 house.class.php 的 class,其中我有一个方法 SQL 查询我的数据库。我通过 index.php
中的 'getColor($id, $DBH)' 调用该方法有没有什么方法可以在不总是将 $DBH 放入调用中的情况下使用该方法?
感谢您的帮助!
您应该从 class 本身而不是在索引文件中获取 $DBH
。然后,您可以使该数据库连接实例可用于 class 广泛地与 class 中的其他方法一起使用,而不必为每个函数重新连接,也不必为每个函数提供连接作为参数。
这方面的一个例子看起来像这样:
house.class.php
<?php
class House{
private $DBH;
function __construct(){
include_once "connection.inc.php";
$this->DBH = $DBH;
}
function getColor($id){
$this->DBH // <---- use it like this instead of your $DBH old variable.
}
}
?>
假设您有一个名为 House
的 class 和 getColor()
方法,并且在您的 index.php
中。您可以在 function/method 中使用关键字 global
,但我强烈反对这样做。示例:
public function getColor(int $id)
{
global $dbh;
//and use it as $dbh
$dbh->prepare(....
}
或者你可以在构造函数中注入它。您的 class 的示例
class House
{
private $dbh;
function __construct($dbh)
{
$this->dbh = $dbh;
}
public function getColor($id)
{
//$this refers to current object context
$this->dbh->prepare.....
}
}
当您实例化 House 对象时,您会将 $DBH
传递给构造函数。您的 index.php
示例:
include_once "connection.inc.php";
$house = new House($DBH);
$house->getColor($id);
尽管如此,我还是建议您查看域驱动设计、工厂和存储库模式以及像 Doctrine 或 Eloquent 这样的 ORM,以更好地了解如何将 application/domain 逻辑与数据库分开。
class Database
{
private $host = "localhost";
private $dbname = "codeignitor";
private $username = "root";
private $password = "";
public $conn;
public function getConnection()
{
$this->conn = null;
try {
$this->conn = new PDO ("mysql:host=" . $this->host . ";dbname=" . $this->dbname, $this->username, $this->password);
$this->conn->exec("set names utf8");
// echo "MySqlConnected";
} catch(PDOException $exception){
echo "Connection error: " . $exception->getMessage();
}
return $this->conn;
}
}