【问题标题】:Set "speeds" of mysql updates (and inserts) with CodeIgniter3使用 CodeIgniter3 设置 mysql 更新(和插入)的“速度”
【发布时间】:2017-03-05 21:40:09
【问题描述】:

在更新中我正在使用它是一个

UPDATE LOW_PRIORITY table 

我们之前使用的是数据库类protect_identifiers中的一个覆盖,它通常看起来像这样

$this->db->_reserved_identifiers = array('*', 'LOW_PRIORITY');

这似乎是滚动到 CI3 的方式。 Codeigniter : Error in ORDER BY CASE query(基本一样的问题)

在 CI2 中调用时

$this->db->_reserved_identifiers = array('*', 'LOW_PRIORITY')  

我试图执行的那段代码会生成

UPDATE LOW_PRIORITY table set ...

但在 CI3 中它会生成

UPDATE 'LOW_PRIORITY' 'table' set ... 

(它似乎基本上试图逃避它。)

现在protect_identifiers var 是受保护的,如果不扩展db-class,我无法真正从外部更新它。我真的不想这样做,因为这似乎是我在 CI 更新后唯一“无法解决”的问题。

是否有可能以不同的方式处理?

这就是我想要做的事情

if($exist){
    if($this->db->update('LOW_PRIORITY table', $allMyDatas)
    /* 
     * Should print something like 
     * UPDATE LOW_PRIORITY table 
     * SET field = 'fielddata' WHERE something = 'something'
     */
} else {
    if($this->db->insert('LOW_PRIORITY table', $allMyDatas)
}

【问题讨论】:

  • protect_identifiers() 的实际使用似乎有什么问题?顺便说一句,你的调用似乎不对,这个函数的签名是这样的:protect_identifiers($item, $prefix_single = FALSE, $protect_identifiers = NULL, $field_exists = TRUE)。好像我误解了你的目标
  • 我的错!添加了错误的代码。这不是protect_identifiers,我试图用它做一些魔法。实际问题在于设置 $this->db->_reserved_identifiers = array('*', 'LOW_PRIORITY');也更新了问题。
  • 我添加了一个答案。希望这可以帮助。如果您愿意,我可以提供基本示例。只是目前我手头没有 CI3 安装来为您提供实际的工作代码来解决您的问题,但应用起来似乎并不难
  • 基本示例会很棒!即使没有 CI3 上下文

标签: php codeigniter mariadb codeigniter-3


【解决方案1】:

据我所知,有两个“黑客”(?)允许您在运行时访问此类受保护/私有属性:反射和闭包。

反射文档说明了一切。闭包似乎是一种更 hacky 的方式,但在这种情况下它实际上比反射更快。 Closure#bind() 允许您进入给定对象的范围并从那里访问它。

这是一个虚拟的例子,但它应该给你一个很好的主意:

class Foo { protected $var = 'protected'; }

$foo = new Foo();
var_dump($foo); // $var value is 'protected'
$fun = function(Foo $obj) { $obj->var = 'unprotected'; };
$closure = Closure::bind($fun, null, $foo);
$closure($foo);
var_dump($foo); // $var value is now 'unprotected'

【讨论】:

  • 据我所知,我还没有处理过反射或闭包,我会尝试看看这是否可以解决我的问题 :)
  • 添加了一个例子。希望这会有所帮助!
  • 谢谢,看来 CI 只是想让我们的开发人员做一些其他事情,而不是使用查询生成器,所以我会按不想要的方式关闭它。
  • 好吧,这并不奇怪,但值得一试。无论如何,扩展基类似乎是最合理的解决方案,考虑到 CI3 的架构。而且它可以是非常“非侵入性”的,因为核心覆盖/扩展可以单独存储并仅在调用时使用
【解决方案2】:

由于开发人员不应该这样做而关闭。参考 CI github 中的问题部分。

【讨论】:

    【解决方案3】:

    LOW PRIORITY 是 MyISAM 表的旧子句。您正在(或应该)使用 InnoDB,它不需要这样。请详细说明对此的渴望;然后,我们可以讨论您不需要它的原因和/或解决方法。

    【讨论】:

    • 我没有理由改变我的数据库结构。我觉得这是对错误问题的错误答案。选择使用 MyISAM 是因为 InnoDB 的速度问题(它不够快)。在这 1% 的情况下,不应该使用 InnoDB。现在可能会更好,但这不是我今天写的新应用程序
    猜你喜欢
    • 2012-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-12
    • 2016-04-19
    相关资源
    最近更新 更多