Tencent / Biny

Biny is a tiny, high-performance PHP framework for web applications
BSD 3-Clause "New" or "Revised" License
1.69k stars 259 forks source link

我这里class TXDAO里面的function update的一个bug #42

Closed hecomlilong closed 6 years ago

hecomlilong commented 6 years ago

您好, 近期在用Biny做一个项目, 不知是php.ini的原因还是什么原因,在类TXDAO里面的函数update中的如下语句 $params = func_get_args(); 在$params[1]中没有传进来TXCond实例,导致最终执行的sql没有加上where条件。

例如我在baseModel类中执行的是$this->DAO->updateByPk(1, ['del'=>1]); 期望执行update client set del=1 where id=1 结果执行update client set del=1

调查发现TXCond中的如下函数已经传了$this了,不知为什么调用func_get_args()取参数时并没有接收到这个object参数。我试了一下,如果是$args[] = 123;啥的是可以传过去的。 public function __call($method, $args) { if (in_array($method, $this->methods) || in_array($method, $this->calcs)){ $args = $args ? $args : ['']; $args[] = $this; return call_user_func_array([$this->DAO, $method], $args); } else { throw new TXException(3009, [$method, CLASS]); } } 我的执行环境是 nginx/1.12.1 PHP/7.1.9 希望您能给些建议或指导,谢谢啦。

billge1205 commented 6 years ago

可能是你DAO对象没有配置pk字段导致的 参考下面这个例子 // testDAO.php 与类名保持一致 class testDAO extends baseDAO { // 表名 protected $table = 'Biny_Test'; // 键值 多键值用数组表示:['id', 'type'] protected $_pk = 'id'; } http://www.billge.cc/#dao

hecomlilong commented 6 years ago

应该不是这个原因,我确定是设了pk了,而且TXCond中的where字段已经是"id=1"了。

billge1205 commented 6 years ago

我不确定是不是开发环境导致的 你可以尝试下直接用 $this->clientDAO->filter(['id'=>1])->update(['del'=>1]) 的形式,看看能不能成功 updateByPK 本质上也是走了上面这个方法 只是多了一层缓存的处理

hecomlilong commented 6 years ago

我用command函数了,不过得自己拼字符串啦。$this->DAO->filter(['id' => $id])->command("UPDATE :table SET $sets WHERE :where;");

billge1205 commented 6 years ago

不是很建议这么使用 毕竟会有sql注入的风险 我刚在mac上用php7.0.23 上是可以正常使用的 我晚些用docker模拟下你的运行环境调试下看看

billge1205 commented 6 years ago

不好意思 没有调试出来这个问题 而且command方法也同样用到了 func_get_args() 来获取TXCond对象 感觉应该不是这个方法导致的 如果有进一步的发现麻烦联系我 谢谢