当前位置: 首页 > 知识库问答 >
问题:

Laravel 4-记录SQL查询

刘绍晖
2023-03-14

在Laravel 4中记录SQL查询已经有几个问题。但是我已经尝试了几乎所有的方法,但仍然没有达到我想要的效果。

这是我的情况

>

  • 在我的php视图文件中,我向服务器发出AJAX请求
  • 接收到AJAX请求并运行RAW参数化的PostgresSQL查询(例如:

    DB::选择('选择*从my_table其中id=?',数组(1))

    如果我用

    Event::listen('illuminate.query', function($sql)
    {
      Log::error($sql);
    });
    

    我只得到“从我的_表中选择*,其中id=?”作为没有实际填充ID值的日志消息。

    如果我用

    $queries = DB::getQueryLog();
    $last_query = end($queries);
    Log::error(print_r($last_query, true));
    

    我仍然没有填充ID的最终SQL查询。

    最后,如果我使用像https://github.com/loic-sharma/profiler-它没有显示任何内容,因为我正在发出AJAX请求。

    我已经用尽了我的选择吗?还有其他更好的方法吗?

  • 共有3个答案

    楚鸿波
    2023-03-14

    继续@Collin James answer。

    如果只想为sql登录到单独的文件,可以使用以下方法:

    if (Config::get('database.log', false)) {
        Event::listen('illuminate.query', function($query, $bindings, $time, $name) {
            $data = compact('bindings', 'time', 'name');
    
            // Format binding data for sql insertion
            foreach ($bindings as $i => $binding) {
                if ($binding instanceof \DateTime) {
                    $bindings[$i] = $binding->format('\'Y-m-d H:i:s\'');
                } else if (is_string($binding)) {
                    $bindings[$i] = "'$binding'";
                }
            }
    
            // Insert bindings into query
            $query = str_replace(array('%', '?'), array('%%', '%s'), $query);
            $query = vsprintf($query, $bindings);
    
            $log = new Logger('sql');
            $log->pushHandler(new StreamHandler(storage_path().'/logs/sql-' . date('Y-m-d') . '.log', Logger::INFO));
    
            // add records to the log
            $log->addInfo($query, $data);
        });
    }
    

    将此文件置于文件顶部:

    use Monolog\Logger;
    use Monolog\Handler\StreamHandler;
    

    这将把您的所有查询记录到一个名为sql-YYYY-mm-dd.log的文件中。

    锺伟志
    2023-03-14

    您应该能够通过传递$bindings作为事件函数的第二个参数来查找绑定。

    Event::listen('illuminate.query', function($sql, $bindings, $time){
        echo $sql;          // select * from my_table where id=? 
        print_r($bindings); // Array ( [0] => 4 )
        echo $time;         // 0.58 
    
        // To get the full sql query with bindings inserted
        $sql = str_replace(array('%', '?'), array('%%', '%s'), $sql);
        $full_sql = vsprintf($sql, $bindings);
    });
    

    在拉威尔3。我认为事件侦听器被称为laravel。查询

    姚海
    2023-03-14

    以下是我目前用于记录sql查询的内容。您应该可以将其放入主路由文件中,然后添加'log'=

    if (Config::get('database.log', false))
    {           
        Event::listen('illuminate.query', function($query, $bindings, $time, $name)
        {
            $data = compact('bindings', 'time', 'name');
    
            // Format binding data for sql insertion
            foreach ($bindings as $i => $binding)
            {   
                if ($binding instanceof \DateTime)
                {   
                    $bindings[$i] = $binding->format('\'Y-m-d H:i:s\'');
                }
                else if (is_string($binding))
                {   
                    $bindings[$i] = "'$binding'";
                }   
            }       
    
            // Insert bindings into query
            $query = str_replace(array('%', '?'), array('%%', '%s'), $query);
            $query = vsprintf($query, $bindings); 
    
            Log::info($query, $data);
        });
    }
    

    感谢Jeemusu回答了关于将绑定插入到准备好的语句中的问题。

     类似资料:
    • 问题内容: 如何记录django应用程序执行的所有SQL查询? 我想记录所有内容,包括来自管理站点的SQL。我看到了这个问题和一个常见问题解答,但是我仍然不知道应该把它放在哪里 将所有内容记录到一个文件? 所以我的问题是-我应该怎么做才能拥有一个记录所有SQL语句的文件(例如all-sql.log)? 问题答案: 也许看看https://github.com/django-debug-toolba

    • 问题内容: 关于在Laravel 4中记录SQL查询,已经有几个问题。但是我已经尝试了几乎所有问题,但仍然无法按照我想要的方式工作。 这是我的情况 在我的php视图文件中,我向服务器发出AJAX请求 接收到AJAX请求并运行RAW参数化的Postgres SQL查询(例如 DB :: select(’select * from my_table where id =?’,array(1)) 如果我

    • 问题内容: 我正在使用Oracle 11g标准版。 我想将用户正在执行的所有SQL查询记录到表中。 如何才能做到这一点? 问题答案: 如果您使用的是现代版本的数据库(9i或更高版本),并且您拥有企业版许可证,则可以使用细粒度审核。它使我们能够通过已定义的策略以非常低的粒度审核用户查询。 要捕获SQL文本并绑定变量,您需要在添加FGA策略时适当设置AUDIT_TRAIL参数。 了解更多。 “我使用的

    • 问题内容: 这是我的表格和这些表格的数据 表名: 代码 表名: 详细信息 结果表: 我想从代码表中获取所有记录,而对于每个代码,我必须从详细信息表中获取所有行,如果某些代码具有所需的值,如果没有,则为Null 谢谢 问题答案: 听起来您在寻找笛卡尔积: 尽管对于较大的表,笛卡尔乘积相当慢…所以请确保这是您真正想要的。

    • 主要内容:基于表的记录,基于游标的记录,用户定义的记录,将记录作为子程序参数在本章中,我们将讨论和学习PL/SQL中的记录。 记录是可以容纳不同种类的数据项的数据结构。 记录由不同的字段组成,类似于数据库表的一行。 例如,想要在图书馆中跟踪记录图书信息。可能希望跟踪每本书的以下属性,例如标题,作者,主题,图书ID。 包含每个这些项目的字段的记录允许将图书视为逻辑单元,并允许以更好的方式组织和表示其信息。 PL/SQL可以处理以下类型的记录 - 基于表的记录 基于游标的记录

    • 问题内容: 我负责处理的应用程序之一是每隔x秒检查一次Oracle DB表,以查看是否有新数据要处理(其他实时应用程序正在填充该数据)。 我们新的客户业务流程迫使我们的实时性在同一时间(比如说10000)同时每天填充几次记录来填充该表。下次我的应用程序检查是否有任何要处理的内容时,遇到10 000条记录并尝试对其进行处理。 它的设计不是很好,而且扩展性还不够好。快速解决方案是限制该应用程序从Ora