【发布时间】:2019-12-24 22:21:04
【问题描述】:
我正在使用这种方法将我的 MySQL 数据库连接到 SELECT、INSERT、UPDATE 和 DELETE 数据。这是cnn() 函数:
function cnn() {
static $pdo;
if(!isset($pdo)) {
$settings = [
PDO::ATTR_TIMEOUT => 30,
PDO::ATTR_PERSISTENT => false,
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
];
try {
# settings
$config['db']['host'] = 'example.com';
$config['db']['name'] = 'db';
$config['db']['user'] = 'username';
$config['db']['pass'] = '****************';
$pdo = new PDO('mysql:host='.$config['db']['host'].';dbname='.$config['db']['name'], $config['db']['user'], $config['db']['pass'], $settings);
return $pdo;
} catch(PDOException $e) {
http_response_code(503);
echo $e->getCode().': '.$e->getMessage();
}
} else {
return $pdo;
}
}
然后我可以这样做,以便在每次我在同一个请求上需要它时重复使用同一个 pdo 对象。
第一次查询
$sql = 'INSERT INTO user (name, lastname) VALUES (:name, :lastname)';
$stmt = cnn()->prepare($sql);
$stmt->bindValue(':name', "John", PDO::PARAM_STR);
$stmt->bindValue(':name', "Wayne", PDO::PARAM_STR);
$stmt->execute();
第二次查询
$sql = 'SELECT * FROM user WHERE id_user = :id_user';
$stmt = cnn()->prepare($sql);
$stmt->bindValue(':id_user', 4641, PDO::PARAM_INT);
$stmt->execute();
$user = $stmt->fetch();
我想知道使用这种方法是否会出现任何性能问题。谢谢。
【问题讨论】:
-
看起来不错,因为连接只会运行一次。但我不确定你为什么使用二维数组作为“配置”,因为它是一个局部变量
-
“看起来不错” @HTMHell 不,这不是很好,请注意
static $pdo.... 后面的代码应该是if(!isset(self::$pdo)) {,self::$pdo = new PDO('mysql:host='.),return self::$pdo;或::..之前的类名。 -
@RaymondNijland 这显然是一个类之外的函数,正如您在他的示例中看到的那样。大家可以看看这个question的答案,了解
static的不同用途。 -
@HTMHell 感谢我并不真正需要的解释,因为我知道 PHP 中的静态或 OOP 编程是如何工作的,相信我,我对静态关键字的评论是一般评论...... “这显然是一个类之外的函数,正如你在他的示例中看到的那样” 是的,我同意我应该在评论中说,当使用类时,你也可以在 @987654338 之前使用 Classname 而不是
self@