在保持相同连接的情况下,在同一 class 中使用不同的 mysql 用户?
Using different mysql users within same class while maintaining same connection?
我处于需要使用 MYSQL 的 LAST_INSERT_ID()
的情况,这显然只有在保持相同连接时才有可能。但是当我考虑建立 PDO 连接的方式时,我突然想到我可能会 运行 遇到问题。
我有一个数据库 class 具有各种类型的连接。在此 class 中,我根据用户权限创建了不同的 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;
}
}
我的问题是...
- 我是否最好为所有查询创建一个具有相同 account/password 的全局连接对象?我这样做是为了安全目的,但我认为它可能有缺点。
- 即使这些是不同的 PDO 连接对象,PHP 是否能够确定它们是同一脚本中同一会话的一部分?在这种情况下,单独的方法就可以了。
- 如何将 mysql 用户与我当前的 class 分开?
显然我可以自己测试这个,但我不确定当我让多个用户访问该站点时结果会是什么。
最好是每页只有一个数据库连接。也许通过使用单例。
首先是为了性能,因为连接是有成本的。
在我看来,没有任何安全问题。
- 我是否最好为所有查询创建一个具有相同 account/password 的全局连接对象?出于安全目的,我这样做了,但我认为它可能有缺点。
我不是安全专家。我认为,如果我能够以只有某些人类帐户可以删除内容的方式管理 mysql 用户和权限,那就是某种安全性。我还认为这会产生许多复杂的后果。另一方面,如果需要,人们可以更新为空字符串...
- 即使这些是不同的 PDO 连接对象,PHP 是否能够确定它们是同一脚本中同一会话的一部分?在这种情况下,单独的方法就可以了。
PHP 对象似乎不是持久化的。我们可以序列化它们并使用 __sleep()
来管理它们的存储。
It [sleep] can clean up the object and is supposed to return an array with the names of all variables of that object that should be serialized.
这部分你可能感兴趣:
The intended use of __wakeup() is to reestablish any database connections that may have been lost during serialization and perform other reinitialization tasks.
- 如何将 mysql 用户与当前 class 用户分开?
使用相同的模式,但确保不要为每个 select 或删除查询创建 pdo 实例。我稍微调整了一下,以便为两个连接重用相同的功能。添加更多就像...命名新 class 成员一样简单。
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);
我处于需要使用 MYSQL 的 LAST_INSERT_ID()
的情况,这显然只有在保持相同连接时才有可能。但是当我考虑建立 PDO 连接的方式时,我突然想到我可能会 运行 遇到问题。
我有一个数据库 class 具有各种类型的连接。在此 class 中,我根据用户权限创建了不同的 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;
}
}
我的问题是...
- 我是否最好为所有查询创建一个具有相同 account/password 的全局连接对象?我这样做是为了安全目的,但我认为它可能有缺点。
- 即使这些是不同的 PDO 连接对象,PHP 是否能够确定它们是同一脚本中同一会话的一部分?在这种情况下,单独的方法就可以了。
- 如何将 mysql 用户与我当前的 class 分开?
显然我可以自己测试这个,但我不确定当我让多个用户访问该站点时结果会是什么。
最好是每页只有一个数据库连接。也许通过使用单例。
首先是为了性能,因为连接是有成本的。
在我看来,没有任何安全问题。
- 我是否最好为所有查询创建一个具有相同 account/password 的全局连接对象?出于安全目的,我这样做了,但我认为它可能有缺点。
我不是安全专家。我认为,如果我能够以只有某些人类帐户可以删除内容的方式管理 mysql 用户和权限,那就是某种安全性。我还认为这会产生许多复杂的后果。另一方面,如果需要,人们可以更新为空字符串...
- 即使这些是不同的 PDO 连接对象,PHP 是否能够确定它们是同一脚本中同一会话的一部分?在这种情况下,单独的方法就可以了。
PHP 对象似乎不是持久化的。我们可以序列化它们并使用 __sleep()
来管理它们的存储。
It [sleep] can clean up the object and is supposed to return an array with the names of all variables of that object that should be serialized.
这部分你可能感兴趣:
The intended use of __wakeup() is to reestablish any database connections that may have been lost during serialization and perform other reinitialization tasks.
- 如何将 mysql 用户与当前 class 用户分开?
使用相同的模式,但确保不要为每个 select 或删除查询创建 pdo 实例。我稍微调整了一下,以便为两个连接重用相同的功能。添加更多就像...命名新 class 成员一样简单。
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);