在更新中,我正在使用它
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)
}
答案 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,它不需要这样的。请详细说明对此的渴望;然后我们可以讨论为什么你不需要它和/或解决方法。