我处于需要使用MYSQL LAST_INSERT_ID()
的情况,这显然只有在维持相同连接时才有可能。但是当我考虑建立PDO连接的方式时,我发现我可能会遇到问题。
我有一个包含各种连接类型的数据库类。在这个类中,我已经根据用户权限创建了不同的PDO连接方法,我在PDO查询方法中调用了这样的方法......
class dbFunctions {
private $userSelect = "userSelect";
private $passSelect = "XXXXX";
private $userDelete = "userDelete";
private $passDelete = "XXXXX";
protected function connectSelect() {
$dsn = $this->dsn();
$this->pdo = new PDO($dsn, $this->userSelect, $this->passSelect, $this->options);
return $this->pdo;
}
protected function connectDelete() {
$dsn = $this->dsn();
$this->pdo = new PDO($dsn, $this->userDelete, $this->passDelete, $this->options);
return $this->pdo;
}
public function selectCount($query, $values = []) {
$result = $this->connectSelect()->prepare($query);
$result->execute($values);
$exec = $result->fetch();
$count = (int)$exec['total'];
return $count;
}
}
我的问题是......
显然我可以自己测试一下,但是当我让多个用户访问该网站时,我不确定结果会是什么。
答案 0 :(得分:0)
最好的是每页只有一个数据库连接。也许通过使用单身人士。
首先是性能,因为连接有成本。
在我看来,没有任何安全问题。
答案 1 :(得分:0)
我不是安全专家。我认为,如果我能够以只有一些人类帐户可以删除内容的方式管理mysql用户和权限,那就是某种安全性。我也认为这有许多复杂的后果。另一方面,如果需要,人们可以更新为空白字符串...
PHP对象似乎不是持久的。我们可以序列化它们并使用__sleep()
来管理它们的存储。
它[sleep]可以清理对象,并且应该返回一个数组,其中包含应该序列化的该对象的所有变量的名称。
这部分可能会让您感兴趣:
__wakeup()的预期用途是重新建立在序列化期间可能已丢失的任何数据库连接并执行其他重新初始化任务。
使用相同的模式,但请确保不为每个选择或删除查询创建pdo实例。我调整了一下,为两个连接重用相同的功能。添加更多内容就像...命名新的类成员一样简单。
class dbFunctions {
// other members
// add these
private $instanceSelect = null; // they default to null anyway
private $instanceDelete = null;
private $instanceFoosball = null;
protected function connect($what) {
if ($this->{"instance".$what} === null) { // true the first time
$this->{"instance".$what} = new PDO($this->dsn(), $this->{"user".$what}, $this->{"pass".$what}, $this->options);
}
return $this->{"instance".$what}; // always reused
}
public function selectCount($query, $values = []) {}
}
$result = $this->connect('Select')->prepare($query);
$result = $this->connect('Foosball')->prepare($query);