簡體   English   中英

如何安全地克隆PDO對象?

[英]How to clone PDO object safely?

我嘗試使用$pdo2 = clone $pdo克隆PDO實例,但是在某些PHP版本中出現意外行為:

  • 在PHP≥7中使​​用克隆的對象時,會發生此錯誤。
  • PDO屬性在HHVM中的原始對象與克隆對象之間鏈接。
  • PHP 5中一切正常。

這是重現該問題的代碼:

$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,用戶名和密碼?

為什么需要克隆PDO實例:我需要保持PDO實例隔離以實現目標:

  • 修改保留的實例不會更改原始實例。
  • 修改原始實例不會更改保留的實例。

無法安全地克隆PDO對象。 您永遠不應該有這樣的想法,因為這沒有任何意義:

  • 如果您希望另一個實例共享相同的數據庫連接 ,則無法按定義將其隔離。 畢竟,另一個實例可以設置不同的SQL模式,啟動事務, 關閉連接
  • 如果您希望另一個實例創建另一個數據庫連接,那么克隆是沒有意義的,只需創建一個新的數據庫連接即可。

因此,如果您想要一個隔離的PDO實例,只需創建它即可。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM