如何安全地克隆PDO对象? [英] How to clone PDO object safely?

查看:59
本文介绍了如何安全地克隆PDO对象?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我尝试使用$pdo2 = clone $pdo克隆PDO实例,但是在某些PHP版本中出现了意外的行为:

I try to clone a PDO instance using $pdo2 = clone $pdo, but I get unexpected behaviour in some PHP versions:

  • 在PHP≥7中使​​用克隆的对象时发生错误.
  • PDO属性在HHVM中的原始对象与克隆对象之间链接.
  • 在PHP 5中一切正常.

下面是重现该问题的代码:

Here is a code that reproduces the problem:

$pdo1 = new \PDO('sqlite::memory:');
$pdo1->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);
echo "PDO 1 is OK\n";

$pdo2 = clone $pdo1;
$pdo2->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_WARNING);
echo "PDO 2 is OK\n";

echo $pdo1->getAttribute(\PDO::ATTR_ERRMODE) === $pdo2->getAttribute(\PDO::ATTR_ERRMODE)
    ? "❌ The attribute IS changed\n"
    : "✅ The attribute IS NOT changed\n";

实时演示

是否有任何方法可以独立复制PDO对象,或者至少仅复制dns,用户名和密码?

Is there any way to make an independent copy of a PDO object or at least copy only dns, username and password?

为什么我需要克隆一个PDO实例:我需要保持一个PDO实例隔离以实现目标:

Why I need to clone a PDO instance: I need to keep a PDO instance isolated to reach goals:

  • 修改保留的实例不会更改原始实例.
  • 修改原始实例不会更改保留的实例.

推荐答案

无法安全地克隆PDO对象.您永远不要有这样的主意,因为它没有任何意义:

There is no way to clone a PDO object safely. You should never have such an idea, as it makes no sense:

  • 如果您希望另一个实例共享相同的数据库连接,则无法通过定义将其隔离.毕竟,另一个实例可以设置不同的SQL模式,启动事务,关闭连接.
  • 如果您希望另一个实例创建另一个数据库连接,那么克隆是没有意义的-只需创建一个新的数据库连接即可.
  • if you want another instance to share the same database connection, then it cannot be isolated by definition. Another instance can set distinct SQL modes, start transactions, close the connection after all.
  • if you want another instance to create another database connection, then it makes no sense to clone - just create a new one.

因此,如果您想要一个隔离的PDO实例,只需创建它即可.

So if you want an isolated PDO instance, just create it.

这篇关于如何安全地克隆PDO对象?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆