如何检查 Opencart 3 中最后执行的查询

How to check last executed query in Opencart3

$data['module_status'] = $this->config->get('visit_module_enabled');

我需要检查在 $this->config->get 中执行了什么查询。 无论如何,就像代码 Igniter 有一个选项 $this->db->last_query() 一样, 我们在 Opencart3 中没有类似的东西吗?

如果这是原始的 Db 对象,那些真的是我们为 $this->db 对象提供的所有功能吗? https://github.com/opencart/opencart/blob/master/upload/system/library/db.php

或者核心 PHP 或 mysql 中的某些实现可以达到同样的效果?

... just like code Igniter has an option $this->db->last_query() , don't we have something similar in Opencart3 ?

不。 Opencart 不是一个框架(如 CodeIgniter)并且不提供强大的函数库。

If this is the original Db object, are those really all the functions we have for $this->db object?

是。

I need to check what query is executed in $this->config->get

这没有任何意义。 $this->config->get() 只是获取 config class 的 $data 属性 的数组键的值。所有这些属性都在站点初始化时加载。其中大部分(不是全部)来自 controller/startup/startup.php:

中的查询
SELECT * FROM `" . DB_PREFIX . "setting` WHERE store_id = '0' OR store_id = '" . (int)$this->config->get('config_store_id') . "' ORDER BY store_id ASC

如果您想知道该特定值的来源,它很可能位于 setting table 中,其中 key = 'visit_module_enabled'.

如果您仍想创建一个 last_query() 方法,那将非常简单,但根据您的问题,我认为它不会满足您的需求。

要创建 last_query() 方法,您可以像这样修改 db class:

private $last_query;

public function query($sql) {
    $this->last_query = $sql;
    return $this->adaptor->query($sql);
}

public function last_query() {
    return $this->last_query;
}

这是一个 VQMOD xml 文件,用于记录 OpenCart 执行的 SQL 查询和执行的持续时间:

<?xml version="1.0" encoding="utf-8"?>
<modification>
    <id>SYSTEM MYSQLI DB LOG vQmod for OC 2.x</id>
    <code>sculptex_mysqli_db_log</code>
    <version>1.0</version>
    <vqmver required="true">2.5.1</vqmver>
    <author>Sculptex</author>

    <file name="system/library/db/mysqli.php">
        <operation>
            <search position="after"><![CDATA[public function query($sql) {]]></search>
            <add><![CDATA[
$logfile = DIR_LOGS."SQL_log.txt";
$starttime  = microtime(true);
]]></add>
        </operation>

        <operation>
            <search position="before"><![CDATA[return $result;]]></search>
            <add><![CDATA[
$endtime  = microtime(true);
$log = sprintf(date("Y-m-d H:i:s",time())." QUERY EXECUTED IN %0.4f - %s", $endtime-$starttime, $sql);
if(!file_exists($logfile)) { file_put_contents($logfile,''); }
$f = fopen($logfile, 'a');
fwrite($f, $log."\n");
fclose($f);
                ]]></add>
        </operation>
    </file>

</modification>

我不是这个 mod 的原作者,几年前在论坛上找到了它。据我所知,它适用于 OpenCart 3。

由于日志文件增长非常快,我会警告不要设置它并保留它。