在使用NOTORM时,如何提取出执行的sql语句,类似__debug__时的sql

碰到这个么需求,为了安全,需要在一个文件中记录CRUD时的sql语句,最好是在执行成功后就进行记录,请问有没有什么好的解决方案?
求大神解惑呀。。跪谢了!
已邀请:

fjsjoy - 80后it男

赞同来自: dogstar

水平有限,最后还是在dogstar的远程下解决了这个需求,特整理下贴出来,方便后面有需要的同学,只需要寥寥几句话就可以了
 
1.可以先在App下面添加一个class, 如:

namespace App\Common;
use PhalApi\Helper\Tracer;
class MyTracer extends Tracer {
 
 public function sql($statement) {
  var_dump("调试:" . $statement); // TODO 自己的处理方法
  
  return parent::sql($statement);
 }
}
 
2. 在config文件夹中的di.php注册一下
$di->tracer = new App\Common\MyTracer();
 
3.开启调试
// 数据操作 - 基于NotORM 强制开启数据库的调试模式
//$di->notorm = new NotORMDatabase($di->config->get('dbs'), $di->debug);
$di->notorm = new NotORMDatabase($di->config->get('dbs'), TRUE);  //只开启数据库调试, 数据库与框架调试是分开的,所以可以单独开启
 
这样就完成了 
 
 
附我的Mytracer目录图
 

dogstar - PhalApi创始人

赞同来自:

这样的场景需要比较少见,但也是可定制实现的。

第一步:
先增加一个新类,实现你的纪录功能,参考https://github.com/phalapi/ker ... er.php" rel="nofollow" target="_blank">PhalApi\Helper\Tracer::sql($statement), 如:
<?php

class MySQLTracer {
public function sql($statement) {
// 纪录到文件

 
\PhalApi\DI()->tracer->sql($statement); // 保留原来的功能
}
}

第二步:
然后在你的Model类里,这样设置调试的回调触发器:
<?php

namespace app\model;
use PhalApi\Model\NotORMModel as NotORM;

class User extends NotORM {

protected function getORM($id) {
$orm = parent::getORM($id);
$orm->debugTimer = array('MySQLTracer', 'sql'); // 重新设置回调
return $orm;
}

public function getListTotal($state) {
$total = $this->getORM() // 正常的使用示例
->where('state', $state)
->count('id');
return intval($total);
}
}

相关的框架源代码请见: 
https://github.com/phalapi/ker ... e.php
https://github.com/phalapi/not ... t.php

相关代码是说明代码,未实际测试过,参考时主要理解思路,代码不可完全相信。

dogstar - PhalApi创始人

赞同来自:

补充一下,上面方案忽略,有更简单的办法。

即采用更简单,更通用,更符合PhalApi文化的办法。

可以重载PhalApi\Helper\Tracer类的sql($statement)方法,在里面追加你的纪录操作。然后在di.php文件重要注册DI()->tracer。

done,来自手机端

fjsjoy - 80后it男

赞同来自:

我需要不开启debug,只获取执行sql语句,可以吗?   能具体点吗?  实是在没有头绪呀

要回复问题请先登录注册