天道酬勤,学无止境

在 CodeIgniter 1.7 中获取原始 SQL 查询(Getting raw SQL Queries in CodeIgniter 1.7)

问题

我正在尝试在我的第一个严肃的 CodeIgniter 应用程序中调试一些代码,但我似乎无法找到可以简单地获取我的 ActiveRecord 代码刚刚生成的原始 SQL 的位置。

    $where  = 'DAY(`datetime_start`) = '. date('d',$day) .' AND ';
    $where .= 'MONTH(`datetime_start`) = '. date('m',$day) .'';

    $this->db->from('events')->where($where);
    $result = $this->db->get();

谢谢您的帮助!

回答1

在查询运行之前:

$this->db->_compile_select(); 

在它运行之后:

$this->db->last_query();
回答2

当然,我在发帖 2 分钟后找到了它,由 Phil Sturgeon 提供。

echo $this->db->last_query();
回答3

此外,您可以将以下内容放入您的控制器中:

$this->output->enable_profiler(TRUE);

你会得到查询和更多。

回答4

对于任何找到这篇旧帖子并想知道最新 v3 中的内容的人来说,函数是 $this->db->get_compiled_select()。

回答5

你可以做这样的事情,直到 CI 的下一个版本发布

private function get_query_string()
{
    return  'SELECT ' . 
            implode( ' , ' , $this->db->ar_select ) .
            ' FROM ' .
            implode( ' , '  , $this->db->ar_from ) .
            ( count( $this->db->ar_where ) ? ' WHERE ' : '' ) .
            implode( ' ' , $this->db->ar_where );
}
标签

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • Getting raw SQL Queries in CodeIgniter 1.7
    I'm trying to debug some code in my first serious CodeIgniter app and I can't seem to find where I can simply get the raw SQL that my ActiveRecord code just generated. $where = 'DAY(`datetime_start`) = '. date('d',$day) .' AND '; $where .= 'MONTH(`datetime_start`) = '. date('m',$day) .''; $this->db->from('events')->where($where); $result = $this->db->get(); Thanks for the help!
  • 从 Laravel 查询生成器生成原始 MySQL 查询(Generate The Raw MySQL Query From Laravel Query Builder)
    问题 我如何获得laravel查询的mysql查询 兑换: App\User::where('balance','>',0)->where(...)->get(); 到: SELECT * FROM users WHERE `balance`>0 and ... 回答1 使用toSql()方法来获取要执行的查询,如 App\User::where('balance','>',0)->where(...)->toSql(); 但是 Laravel 不会在您的查询中显示参数,因为它们是在准备好查询之后绑定的。 要获取绑定参数,请使用此 $query=App\User::where('balance','>',0)->where(...); print_r($query->getBindings() ); 将查询日志启用为DB::enableQueryLog() ,然后将上次运行的查询输出到屏幕上,您可以使用它, dd(DB::getQueryLog()); 回答2 您可以将此功能添加到您的助手中 function getRealQuery($query, $dumpIt = false) { $params = array_map(function ($item) { return "'{$item}'"; }, $query->getBindings()); $result =
  • Linq2Sql - 为将来的动态执行存储复杂的 Linq 查询 - 原始文本 - 可能吗?(Linq2Sql - Storing Complex Linq Queries for future dynamic execuction - raw text - possible?)
    问题 我在使用 Linq2Sql 时玩得很开心。 表达式树很棒,而且标准的 Linq2Sql 语法很有趣。 我现在是我的应用程序的一部分,我必须以某种方式将查询存储在数据库中,这些查询是为使用相同数据库和相同表的不同客户定制的(好吧,视图,但你知道我的意思)。 基本上,我不能硬编码任何东西,我必须保留查询语言明文,以便有人可以编写新的 where-clause 类型查询。 所以,如果这个描述很苛刻,让我澄清一下: 在我们应用程序的先前版本中,我们曾经使用原始 SQL 对数据库进行直接 SQL 调用。 是的。 它很有趣,很脏,而且很管用。 我们会有一个充满不同标准的数据库表,比如 (EventType = 6 and Total > 0) 或子查询样式 (EventType = 7 AND Exists ( select * from events as e1 where events.EventType = e1.EventType and e1.objectNumber = 89) ) (有人注入 sql 吗?) 在 Linq2Sql 中,这有点更具挑战性。 我可以在 CLR 中进行所有这些查询,但能够将动态 where 条件传递给 Linq 更具挑战性,特别是如果我想执行子查询(如上面的示例)。 我的一些想法: 获取原始表达式并存储它 ---
  • 如何获取查询生成器以字符串形式输出其原始SQL查询?(How Do I Get the Query Builder to Output Its Raw SQL Query as a String?)
    问题 给出以下代码: DB::table('users')->get(); 我想获取上面的数据库查询生成器将生成的原始SQL查询字符串。 在此示例中,它将是SELECT * FROM users 。 我该怎么做呢? 回答1 要将最近运行的查询输出到屏幕,您可以使用以下命令: DB::enableQueryLog(); // Enable query log // Your Eloquent query executed by using get() dd(DB::getQueryLog()); // Show results of log 我相信最近的查询将在数组的底部。 您将拥有类似的东西: array(1) { [0]=> array(3) { ["query"]=> string(21) "select * from "users"" ["bindings"]=> array(0) { } ["time"]=> string(4) "0.92" } } (感谢约书亚在下面的评论。) 回答2 在QueryBuilder实例上使用toSql()方法。 DB::table('users')->toSql()将返回: 从用户中选择* 这比连接事件侦听器更容易,并且还使您可以在构建查询时随时查看查询的实际外观。 回答3 只有在使用$builder->get()执行查询之后, DB
  • 如何查看Django正在运行的原始SQL查询?(How can I see the raw SQL queries Django is running?)
    问题 有没有一种方法可以显示执行查询时Django正在运行的SQL? 回答1 请参阅文档常见问题解答:“如何查看Django正在运行的原始SQL查询?” django.db.connection.queries包含SQL查询的列表: from django.db import connection print(connection.queries) 查询集还具有一个查询属性,其中包含要执行的查询: print(MyModel.objects.filter(name="my name").query) 请注意,查询的输出不是有效的SQL,因为: “ Django实际上从未插值参数:它将查询和参数分别发送到数据库适配器,后者执行适当的操作。” 来自Django错误报告#17741。 因此,您不应将查询输出直接发送到数据库。 回答2 Django扩展具有带参数print-sql的命令shell_plus ./manage.py shell_plus --print-sql 在django-shell中,所有执行的查询将被打印 前任。: User.objects.get(pk=1) SELECT "auth_user"."id", "auth_user"."password", "auth_user"."last_login", "auth_user"."is_superuser",
  • Laravel 4:如何运行原始SQL?(Laravel 4: how to run a raw SQL?)
    问题 我想在Laravel 4中重命名表,但是不知道该怎么做。 SQL将alter table photos rename to images 。 如果有一个雄辩的解决方案,我也想知道如何运行原始SQL,因为有时别无选择。 回答1 在Laravel 4手册中-讨论了执行以下原始命令: DB::select(DB::raw('RENAME TABLE photos TO images')); 编辑:我刚刚在Laravel 4文档中发现了这一点,它可能更好: DB::statement('drop table users'); 更新:在Laravel 4.1(也许是4.0-我不确定)中,您也可以针对原始的Where查询执行此操作: $users = User::whereRaw('age > ? and votes = 100', array(25))->get(); 进一步更新如果您特别希望进行表重命名-有一个用于此的模式命令-有关此信息,请参见下面的Mike回答。 回答2 实际上,Laravel 4在Illuminate / Database / Schema / Builder.php中确实具有表重命名功能,但目前尚无文档记录: Schema::rename($from, $to); 。 回答3 您也可以使用DB::unprepared为ALTER TABLE查询。 DB
  • 在Codeigniter中结合mysql AND OR查询(combining mysql AND OR queries in Codeigniter)
    问题 我想在CI中组合AND OR mysql查询。 我已经看过这个线程:http://codeigniter.com/forums/viewthread/92818/。 但是他们没有提供确切的解决方案。 如何严格使用CI框架创建以下查询? (我可以轻松地创建查询而不使用方括号,但是这样的查询就不一样了。) SELECT * FROM `Persons` WHERE LastName='Svendson' AND Age="12" AND (FirstName='Tove' OR FirstName='Ola' OR Gender="M" OR Country="India") PS:这只是一个示例查询,即使没有意义,也不建议在单个where()内编写查询的整个OR部分。 编辑:基本上我想要以下简单查询的实现: SELECT * FROM `table` WHERE field1='value1' AND (field2='value2' OR field3='value3') 回答1 这行得通吗? $this->db->where('LastName', 'Svendson'); $this->db->where('Age', 12); $this->db->where("(FirstName='Tove' OR FirstName='Ola' OR Gender='M' OR
  • CakePHP 3原始SQL查询(CakePHP 3 Raw SQL Query)
    问题 我正在使用CakePHP 3,我需要在多个表上运行原始SQL查询。 在CakePHP 2中,可以通过在任何模型( $this->Messages->query("select..") )上使用query()方法来完成此操作。 我需要允许我在CakePHP 3中运行SQL查询的方法。以下是我正在使用的代码段: $aumTable = TableRegistry::get('Messages'); $sql = "SELECT (SELECT COUNT(*) FROM `messages`) AS `Total_Count`, (SELECT COUNT(*) FROM `messages_output`) AS `Total_Output_Count`, (SELECT COUNT(*) FROM `messages_output` WHERE `is_success`=1) AS `Total_Successful_Output_Count`, (SELECT COUNT(*) FROM `messages_output` WHERE `is_success`=0) AS `Total_Error_Output_Count`, (SELECT COUNT(*) FROM `users`) AS `Total_User_Count`;"; // to run this raw
  • 如何获取 Laravel 删除/更新/插入语句的原始 SQL?(How to get the raw SQL for a Laravel delete/update/insert statement?)
    问题 我知道我可以在查询构建器上使用toSql方法来获取带有SELECT语句的绑定参数占位符的原始 SQL。 App\User::where(['id'=>'1'])->toSql(); "select * from `users` where (`id` = ?)" 但是我怎样才能为DELETE语句得到这个呢? App\User::where(['id'=>'1'])->delete()->toSql(); PHP 错误:在第 1 行的整数上调用成员函数 toSql() 这将执行该语句,但我希望在不实际运行查询的情况下,使用代表值的问号生成原始的、未插值的 SQL。 同样的情况适用于任何修改语句,例如INSERT或UPDATE 但为什么,谁在乎呢? 这闻起来很像 xy 问题。 我的 Web 应用程序包含一个多进程架构。 它在更新数据库的事件驱动循环中运行带有异步通信侦听的自定义工匠命令。 我需要原始查询的原因是因为我想重用准备好的语句以提高性能。 不幸的是,eloquent 方法没有公开准备好的语句,所以为了重用一个,我必须自己从底层 PDO 连接准备它。 $sql = 'UPDATE `foo` SET `bar` = ? WHERE (`id` = ?)'; $statement = DB::connection()->getPdo()->prepare($sql)
  • 在Laravel 4中转义原始SQL查询(Escape raw SQL queries in Laravel 4)
    问题 如何逃避在Laravel 4中传递给原始查询的参数? 我期望有类似DB::escape()声音(它从Laravel 3响起),并且还尝试了DB::quote() (我认为可以通过PDO对象获得)。 $query = DB::select("SELECT * FROM users WHERE users.id = " . DB::escape($userId)); 我们不能将select方法与占位符一起使用,因为以上只是我们要实现的简化示例。 我们有一个大型自定义查询,其中包含一些嵌套的选择查询,这些查询无法适应查询生成器。 在Laravel 4中插入之前转义内容的最佳方法是什么? 编辑: 我刚刚发现,您可以通过这种方式访问​​PDO对象并在其上使用quote函数。 这仍然是最好的方法,还是有一种更简单的方法来访问此功能? DB::connection()->getPdo()->quote("string to quote"); 回答1 您可以通过DB外观以这种方式引用字符串。 DB::connection()->getPdo()->quote("string to quote"); 当我找到答案时,确实将它放在了问题中,但是现在我把它作为一个实际答案,以使其他人更容易找到。 回答2 $value = Input::get("userID"); $results = DB
  • 如何将 Laravel 迁移转换为原始 SQL 脚本?(How to convert Laravel migrations to raw SQL scripts?)
    问题 我团队的开发人员真的习惯了 Laravel 迁移的强大功能,他们在本地机器和我们的开发服务器上工作得很好。 但是客户的数据库管理员不会接受 Laravel 迁移。 他要求为我们应用程序的每个新版本提供原始 SQL 脚本。 是否有任何工具或编程技术可以捕获从 Laravel 迁移到上/下 SQL 脚本的输出? 如果我们可以在创建生产构建时将 SQL 脚本生成集成到我们的 CI 系统 (TeamCity) 中,那将是完美的。 顺便说一下,我们将在这个项目中使用 Laravel 5 和 PostgreSQL。 回答1 使用迁移命令 您可以在运行php artisan migrate以将查询输出到终端时添加--pretend标志: php artisan migrate --pretend 这看起来像这样: Migration table created successfully. CreateUsersTable: create table "users" ("id" integer not null primary key autoincrement, "name" varchar not null, "email" varchar not null, "password" varchar not null, "remember_token" varchar null,
  • SQLAlchemy (ORM) 与原始 SQL 查询 [重复](SQLAlchemy (ORM) vs. raw SQL queries [duplicate])
    问题 这个问题在这里已经有了答案: 使用 ORM 还是普通 SQL? [关闭] (13 个回答) 4年前关闭。 在上个月,我致力于研究 Flask,一个用于构建 Web 应用程序的 Python 框架。 按照我在网上找到的不同教程,我发现了 SQLAlchemy。 老实说,我觉得它很复杂而且不是很有用,因为我对 SQL 语言有很好的了解。 我想了解的是,在使用像 SQLAlchemy 这样的 ORM 时是否有任何重大的收获,我所缺少的(也许在使用纯 sql 时存在一些我不知道的安全问题?)。 另外,如果您能建议我什么是处理纯 SQL 查询的最佳 Python 库,我将不胜感激。 回答1 有许多。 我认为使用 ORM 而不是原始 SQL 查询的最大优势是: 健壮性:您不必担心在为不同的 Databse 源编写 SQL 查询时可能会犯的语法错误。 事实上,您不需要知道所有数据库源的语法。 相同的 ORM 查询适用于所有人。 无论是像 MySQL 这样的基于 SQL 的引擎,还是像 MongoDB 这样的基于 NoSQL 的引擎可扩展性:随着业务需求或您正在处理的数据种类/数量的变化。 更改数据库引擎是很常见的。 您不必担心查询中的损坏,因为 ORM 会处理它。 唯一的条件是您的 ORM 应该支持该数据源。 安全性:您不必担心由于 SQL 注入等导致的安全漏洞,因为 ORM
  • Rails原始SQL示例(Rails raw SQL example)
    问题 如何将此代码转换为原始sql并在rails中使用? 因为当我在heroku中部署此代码时,出现了请求超时错误。我认为如果使用原始sql会更快。 @payments = PaymentDetail.joins(:project).order('payment_details.created_at desc') @payment_errors = PaymentError.joins(:project).order('payment_errors.created_at desc') @all_payments = (@payments + @payment_errors) 回答1 你可以这样做: sql = "Select * from ... your sql query here" records_array = ActiveRecord::Base.connection.execute(sql) records_array将是您可以迭代访问的数组中sql查询的结果。 回答2 我知道这很旧了...但是今天我遇到了同样的问题,找到了解决方案: Model.find_by_sql 如果要实例化结果: Client.find_by_sql(" SELECT * FROM clients INNER JOIN orders ON clients.id = orders.client
  • 获取在Laravel 3/4中执行的查询(Get the Query Executed in Laravel 3/4)
    问题 如何使用Laravel Query Builder或Eloquent ORM在Laravel 3/4中检索原始执行的SQL查询? 例如,如下所示: DB::table('users')->where_status(1)->get(); 或者: (posts (id, user_id, ...)) User::find(1)->posts->get(); 否则,至少如何将所有执行的查询保存到laravel.log? 回答1 Laravel 4+ 在Laravel 4和更高版本中,您必须调用DB::getQueryLog()来获取所有已运行的查询。 $queries = DB::getQueryLog(); $last_query = end($queries); 或者,您可以下载探查器软件包。 我建议使用barryvdh / laravel-debugbar,它非常简洁。 您可以阅读有关如何在其存储库中进行安装的说明。 Laravel 5用户注意事项:在执行查询之前,您需要调用DB::enableQueryLog() 。 要么在运行查询的行的上方,要么在中间件内部。 Laravel 3 在Laravel 3,你可以从上次执行的查询Eloquent模型调用静态方法last_query在DB类。 DB::last_query(); 但是,这要求您在application
  • Codeigniter 链接查询(Codeigniter linking queries)
    问题 如果这是一个真正的 n00b 问题,我很抱歉,但我似乎无法解决这个问题。 我正在使用 mahana 消息库,我正在尝试创建一些基本视图和基本控制器来发送消息和检索消息。 我已经发送了一条消息(差不多),我可以在收件人的个人资料上查看已发送的消息。 这是我的问题。 我希望能够在收件人查看消息页面上显示发送消息的用户的详细信息以及发送的消息。 这些详细信息存储在用户表中。 问题是,如何根据消息模型中 get_all_threads($user_id) 模型的结果,运行模型查询以从我的消息控制器中的 view_my_messages 函数中获取用户名、头像位置等? 我已经包含了下面的控制器、视图和模型的代码。 控制器: function view_my_messages(){ $this->load->library('mahana_messaging'); $user_id = $this->session->userdata('id'); $data['message'] = $this->mahana_model->get_all_threads($user_id); $this->load->view('messages/my_messages',$data); } 消息模型: function get_all_threads($user_id, $full_thread
  • 防止对将查询生成器与DB :: raw()组合在一起的查询进行SQL注入(Prevent SQL injection for queries that combine the query builder with DB::raw())
    问题 在Laravel 4中,我想保护一些复杂的数据库查询免于SQL注入。 这些查询使用查询生成器和DB :: raw()的组合。 这是一个简化的示例: $field = 'email'; $user = DB::table('users')->select(DB::raw("$field as foo"))->whereId(1)->get(); 我已经阅读了Chris Fidao的教程,可以通过使用准备好的语句将绑定数组传递给select()方法,因此可以正确地防止SQL注入。 例如: $results = DB::select(DB::raw("SELECT :field FROM users WHERE id=1"), ['field' => $field] )); 这可行,但是该示例将整个查询放入原始语句中。 它不会将查询生成器与DB :: raw()结合在一起。 当我使用第一个示例尝试类似操作时: $field = 'email'; $user = DB::table('users')->select(DB::raw("$field as foo"), ['field' => $field]) ->whereId(1)->get(); ...然后我得到一个错误: strtolower()期望参数1为字符串,给定数组 对于结合了查询构建器和DB :: raw()的查询
  • Sqlalchemy - 执行原始 sql 查询(Sqlalchemy - executing raw sql queries)
    问题 我在连接到多个数据库的烧瓶应用程序中使用 sqlalchemy,使用绑定,如下所示。 我想对非主数据库之一执行原始 sql 查询。 我正在尝试使用 session.execute,如下所示,但它为主数据库执行。 API 文档说明您可以使用一个参数:“绑定 - 用作绑定的可选引擎”。 如何访问和指定非主数据库的绑定并调用 session.execute 来执行对该数据库的查询? 或者,有没有其他方法可以解决这个问题? 回答1 试试这个: from flask import current_app db.get_engine(current_app, bind='<your_bind>').execute('<your raw sql>')
  • 在 Codeigniter 2.0 中编写 SQL 查询(Writing SQL Queries in Codeigniter 2.0)
    问题 我有以下功能不起作用,我最难弄清楚。 我 12 岁,正在学习,所以请原谅我: function get_answer() { $answer = $this->db->query("SELECT COUNT(questions) FROM possible_quest WHERE questions='something'"); return $answer; } 当我在 phpmyadmin 中运行以下 SQL 查询时,它返回预期的结果 SELECT COUNT(questions) FROM possible_quest WHERE questions='something' 如何使用上面的函数在 CodeIgniter 中工作? 我得到的 PHP 错误是 遇到 PHP 错误严重性:4096 消息:类 CI_DB_mysql_result 的对象无法转换为字符串 回答1 可能: function get_answer() { $query = $this->db->query("SELECT COUNT(questions) AS count FROM possible_quest WHERE questions='something'"); $count = $query->row(); // returns an object of the first row
  • 通过 sequelize.query() 插入原始查询时钩子不触发(Hooks not triggering when inserting raw queries via sequelize.query())
    问题 我有以下 MySQL 数据库的Employee模型: var bcrypt = require('bcrypt'); module.exports = (sequelize, DataTypes) => { const Employee = sequelize.define( "Employee", { username: DataTypes.STRING, password: DataTypes.STRING, }, {} ); return Employee; }; 通过原始查询读取包含 10,000 多名员工的.sql文件来完成数据库的播种: sequelize.query(mySeedingSqlFileHere); 问题是 SQL 文件中的密码是纯文本,我想在插入数据库之前使用 bcrypt 对它们进行散列。 我以前从未做过批量插入,所以我正在查看 Sequelize 文档以向 Employee 模型添加一个钩子,如下所示: hooks: { beforeBulkCreate: (employees, options) => { for (employee in employees) { if (employee.password) { employee.password = await bcrypt.hash(employee.password, 10); } }
  • 带有codeigniter的活动记录模式的UNION查询(UNION query with codeigniter's active record pattern)
    问题 如何使用PHP CodeIgniter框架的活动记录查询格式进行UNION查询? 回答1 CodeIgniter的ActiveRecord不支持UNION,因此您只需编写查询并使用ActiveRecord的查询方法即可。 $this->db->query('SELECT column_name(s) FROM table_name1 UNION SELECT column_name(s) FROM table_name2'); 回答2 通过使用last_query()进行联合,可能会影响应用程序的性能。 因为对于单个联合,它将需要执行3个查询。 即对于“ n”个联合“ n + 1”个查询。 对于1-2个查询并集不会有太大影响。 但是,如果将许多具有大数据的查询或表并集,则会出现问题。 该链接将为您提供很多帮助:活动记录子查询 我们可以将活动记录与手动查询结合起来。 例子: // #1 SubQueries no.1 ------------------------------------------- $this->db->select('title, content, date'); $this->db->from('mytable'); $query = $this->db->get(); $subQuery1 = $this->db->_compile_select()