【问题标题】:Pdo table prefixPdo 表前缀
【发布时间】:2014-01-30 23:06:43
【问题描述】:

我在构建 Web 应用程序时依赖 Pdo Api,结果证明它是一个非常大的应用程序,现在我需要能够为诸如 prefix_tablename 之类的表添加前缀...我应该如何处理这个问题?

  • 制作一个包装器(耗时、难做等)。
  • 添加一个 str_replace 每次查询后,是的,这听起来很愚蠢......

    $stmt = $db->prepare("query FROM :prefix:table")...

等等

扩展 PDO 类并在其中破解一些方法?

是否有任何我可能错过的神奇功能可以帮助我实现这一目标...?

【问题讨论】:

  • 选项 3:重新考虑您的数据库设计(即您真的需要为表添加前缀吗?)
  • 为什么需要为表格添加前缀?

标签: php pdo


【解决方案1】:

这根本不是您想要的答案,但我建议您使用 DBAL数据库抽象层)。在这种情况下,我会推荐Doctrine。如果您使用它,您只需更改entities 内的表名。您的代码将完全相同。

无论如何,祝你好运。除了更改数据库之外没有简单的答案

【讨论】:

    【解决方案2】:

    您可以扩展 PDO 类并使用 magica 方法 __call() 来检查正在调用的 prepare() 方法并替换查询文本中的 ::prefix::。应该是这样的:

    class PrefixedPDO extends PDO {
    
       /**
        * @link http://www.php.net/manual/en/language.oop5.overloading.php#object.call
        */
       public function __call($name, $arguments)
       {
          // according to [this](http://php.net/manual/ru/pdo.prepare.php) - query should be in the args
          if ($name === 'prepare') {
              // check for the ::prefix:: in the query text (use params for that)
          }
       }
    
    }
    

    您还需要将 PDO 初始化更改为新类 - PrefixedPDO()

    希望这会有所帮助。

    【讨论】:

    • 不是__call 仅在找不到方法时调用。在您的示例中,自定义类扩展了 PDO,因此当有人访问 prepare 方法时,永远不会调用魔术 __call
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-27
    • 2012-12-17
    • 2011-04-21
    • 2012-06-11
    • 2015-05-19
    • 1970-01-01
    • 2016-11-04
    相关资源
    最近更新 更多