设置"速度"使用CodeIgniter3进行mysql更新(和插入)

时间:2016-10-24 07:29:17

标签: php codeigniter mariadb codeigniter-3

在更新中,我正在使用它

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)
}

3 个答案:

答案 0 :(得分:0)

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

反思文件说明了一切。闭包似乎有点像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'

答案 1 :(得分:0)

关闭,因为开发人员不应该这样做。参考CI github中的问题部分。

答案 2 :(得分:0)

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