codeigniter 代码点火器4:如何在发送HTTP请求和接收HTTP响应之间执行MySQL查询

piwo6bdm  于 2022-12-06  发布在  Mysql
关注(0)|答案(1)|浏览(89)

1.开始吧。

  1. HTTP要求。
    1.执行SQL查询。
  2. HTTP响应。
    我想得到请求和响应之间的查询(多少个查询和原始SQL查询)。
    ->getLastQuery()只返回最后一个查询。我希望保存发送HTTP请求和接收HTTP响应之间的所有查询。
我失败的例子;
<?php

class Logger implements FilterInterface
{
    use ResponseTrait;

    public function before(RequestInterface $request, $arguments = null)
    {

    }

    public function after(RequestInterface $request, ResponseInterface $response, $arguments = null)
    {
        $this->db = \Config\Database::connect();
        $this->db->getLastQuery()->getOriginalQuery();
        if ($this->db->getLastQuery()->isWriteType()) {
            echo "updated or write query";
        }
        $return = $this->db->getLastQuery()->getOriginalQuery();
        $logger = new Client();
        $logger->logQueries($return);
    }
}
gjmwrych

gjmwrych1#

说明

尝试使用调试工具栏。* 调试工具栏提供有关当前页请求的概览信息,包括基准测试结果、已运行的查询、请求和响应数据等。*
或者,您可以通过订阅DBQuery事件来执行应用程序,这可以通过向app/Config/Events.php类注册来完成,以便让它知道您希望在触发该事件时执行某个操作。
定义事件
大多数事件在app/Config/Events.php文件中定义。您可以使用Events类的on()方法为事件订阅操作。第一个参数是要订阅的事件的名称。第二个参数是将在触发该事件时运行的可调用对象:

<?php

use CodeIgniter\Events\Events;

Events::on('pre_system', ['MyClass', 'myFunction']);

在这个例子中,每当pre_system事件被执行时,就会创建一个MyClass的示例并运行myFunction()方法。注意,第二个参数可以是PHP能够识别的任何形式的callable

<?php

// Call a standalone function
Events::on('pre_system', 'some_function');

// Call on an instance method
$user = new User();
Events::on('pre_system', [$user, 'someMethod']);

// Call on a static method
Events::on('pre_system', 'SomeClass::someMethod');

// Use a Closure
Events::on('pre_system', static function (...$params) {
    // ...
});

溶液

在您的app/Config/Events.php课程中,订阅DBQuery事件。

  • DBQuery -----:在数据库查询成功与否后调用。接收\CodeIgniter\Database\Query对象。* -事件点
Events::on("DBQuery", static function (\CodeIgniter\Database\Query $query) {

    // Add your SQL query logging logic here. I.e:
    log_message("error", $query->getQuery());

});

相关问题