我已移至PDO并为我的所有查询(SELECT/DELETE/INSERT/UPDATE
)编写了一个小函数:
function pdo_query($query, $parameter)
{
try {
$db=new PDO("mysql:host=localhost;dbname=...","root","");
} catch (PDOException $e) {
die("DB-Error!");
}
$stmt = $db->prepare($query);
$stmt->execute($parameter);
if (substr($query,0,6)=="SELECT") {
return $stmt->fetchAll(PDO::FETCH_ASSOC);
} else {
return $stmt->rowCount();
}
}
我在某些页面上多次使用此功能,因此会产生多个数据库连接/对象。
是否可以将连接置于查询函数之外?
我认为这可行,但它没有:
global $db;
try {
$db=new PDO("mysql:host=localhost;dbname=...","root","");
} catch (PDOException $e) {
die("DB-Error!");
}
function pdo_query($query, $parameter)
{
$stmt = $db->prepare($query);
$stmt->execute($parameter);
if (substr($query,0,6)=="SELECT") {
return $stmt->fetchAll(PDO::FETCH_ASSOC);
} else {
return $stmt->rowCount();
}
}
有什么想法吗?
答案 0 :(得分:0)
你也必须在你的功能中使用global $db;
。但是当你开始做这样的事情时,问问自己,“为什么我不写OO代码”?编写一个类,将$db
定义为该类的静态成员,并在构造函数中初始化它。
更好的是,在基类中执行此操作,然后为需要查询的各种表扩展该类。你会在路上...
答案 1 :(得分:0)
global
关键字用于函数级别,并告诉函数查找并使用全局范围中的变量。要做到这一点,请执行:
function pdo_query($query, $parameter)
{
global $db;
$stmt = $db->prepare($query);
...
并删除最初的全局声明,因为它不再需要:
global $db;
最后,考虑将所有这些封装在一个类中,以实现真正的面向对象编程。
答案 2 :(得分:0)
没有必要使用全局。无论您的函数是类方法还是函数,它都可以接受数据库连接作为参数。因此,您可以创建一次连接,并将其传递给任何需要它的函数。
function pdo_query ($connection, $query, $parameter) {
$stmt = $connection->prepare($query);
$stmt->execute($parameter);
if (substr($query, 0, 6) == "SELECT") {
return $stmt->fetchAll(PDO::FETCH_ASSOC);
} else {
return $stmt->rowCount();
}
}
try {
$db=new PDO("mysql:host=localhost;dbname=...","root","");
} catch (PDOException $e) {
die("DB-Error!");
}
$result = pdo_query($db, $the_query, $the_params);
答案 3 :(得分:0)
出于同样的考虑,我选择了以下解决方案:
- 创建一个" Dbwrapper"具有pdo DB作为成员的类
- 构造函数使用有用信息($this->host
,->user
,->password
,->db
等)初始化成员,并将布尔变量$this->isconnected
设置为false。构造函数不会打开连接(*)
- connect()
方法检查$this->isconnected
的值:如果未连接,则实际打开连接(实例化pdo成员),如果成功,则将$this->isconnected
设置为true
- 查询方法都以调用connect()
开始,这只是...如果已经连接则没有任何内容,否则连接。
因此,我现在只需要实例化一个新的Dbwrapper对象,并在每次执行查询时调用其查询方法,而不必打开数据库,只有在需要时才能透明地完成它。 / p>
请注意,我选择在pdo对象周围定义一个包装类。您还可以考虑从pdo派生自己的类来添加此功能。
(*)因为构造函数只是做了一些变量初始化并且没有打开任何连接,我通常在init.php文件(包括其他网站范围的变量定义)中为所有实例化它一次在网站的每个脚本中。