现在我在php页面的每个函数中创建一个dbo对象。可以
define($dbh3, new PDO(...));//test
声明工作?我可以将PDO对象称为全局常量吗?
如何创建常见的pdo连接?我是否必须在每个函数中创建一个pdo对象?
现状:
$dbh = new PDO(...);
define($dbh3, new PDO(...));//test
function actorexists($name) {
$dbh = new PDO(...);
$s = $dbh->prepare("...");
}
function login($name, $password) {
$dbh = new PDO(...);
$s = $dbh->prepare("..."}
}
function actorbyname($name) {
$dbh = new PDO(...);
$s = $dbh->prepare("...;
}
答案 0 :(得分:1)
绝对不要为每个SQL语句打开一个新连接。这非常浪费,因为您可以在单个PHP请求期间运行许多查询,并且打开新套接字和验证MySQL用户会有一些开销。它没有Oracle或其他数据库的开销那么糟糕,但是你应该尽可能地尽量减少它。
但是你不能为你的dbh定义一个常量。
...只允许标量和空值。标量值是整数,浮点数,字符串或布尔值。
换句话说,对象实例或数组不是常量的合法值:
<?php
define('DB', new stdClass());
Warning: Constants may only evaluate to scalar values
in test_define_constant_object.php on line 3
您可以将$ dbh设置为全局,但许多PHP开发人员不鼓励使用全局变量。
您还可以使用Registry Pattern,它基本上是一个全局数组类,可以代替单个全局变量使用。在脚本的引导代码中执行此操作,因此每个请求只运行一次:
Zend_Registry::set("dbh", new PDO(...));
然后在你的函数中:
$dbh = Zend_Registry::get("dbh");
$s = $dbh->prepare("...");
答案 1 :(得分:0)
我不会将对象定义为常量。举个例子,你可以把它注入你需要的地方。
function actorexists($pdo, $name) {
$s = $pdo->prepare("...");
}
function login($pdo, $name, $password) {
$s = $pdo->prepare("...");
}
function actorbyname($pdo, $name) {
$s = $pdo->prepare("...");
}
$dbh = new PDO("...");
$exists = actorexists($dbh, 'foo');
$foo = actorbyname($dbh, 'foo');