codeigniterモデルでSQLステートメントを印刷する方法


107

モデルにsqlステートメントがあります。

次に言う

$query = $this->db->query($sql, array(fields, fields1);

if ($query) {
    return true:
} else {
    echo "failed";
    return false;
}

私のクエリは常に失敗します。データベースに送信されている正確なSQLステートメントをphpに出力するにはどうすればよいですか?そして、それを私のphpビューのページに表示します

回答:


124

クエリ文字列を表示するには:

print_r($this->db->last_query());    

クエリ結果を表示するには:

print_r($query);

プロファイラークラスは、ページの下部にベンチマーク結果、実行したクエリ、および$ _POSTデータを表示します。プロファイラーを有効にするには、コントローラーメソッド内の任意の場所に次の行を配置します。

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

プロファイリングユーザーガイド:https : //www.codeigniter.com/user_guide/general/profiling.html


7
私がprint_r($ query);を行うとき 何も出力されない
Technupe、2011年

1
プロファイラーに組み込まれているCIを使用してください。詳細はこちら
Novo

2
データベースに渡されたSQLステートメントを出力するだけですが、プロファイラーはどちらも
役に立ち

私が投稿したユーザーガイドリンクにアクセスし、機能しない場合は、代わりに何が起こるかを教えてください。
ノボ

まあ私は私の問題を理解しました、オラクルは私の日付形式を受け入れていません、私が思うすべての形式を試しました、それはSYSDATEのみを受け入れます
Technupe '26


41

ActiveRecordで生成されたSQLを表示できます。

クエリを実行する前に:

$this->db->_compile_select(); 

そしてそれが実行された後:

$this->db->last_query(); 

4
$ this-> db-> _ compile_select();を使用する場合 致命的なエラーが発生する:プロテクトメソッドCI_DB_active_record :: _ compile_select()の呼び出し
Angelin Nadar

プロファイラーは私にとっては良くありません、必要なクエリが表示されません、SQLを取得するだけでは複雑です...これは私にとってはうまくいきます:
ローレンスコープ2013年

3
CI3では、$this->db->get_compiled_select()代わりに使用してください。
Nick Tsai

17

クエリの簡単なテストが必要な場合、これは私にとってうまくいきます

echo $this->db->last_query(); die;

14

使用に失敗した後、_compiled_select()またはオブジェクトをget_compiled_select()印刷dbしたところ、queriesプロパティのクエリを確認できます。

自分で試してください:

var_dump( $this->db );

クエリが1つしかないことがわかっている場合は、直接印刷できます。

echo $this->db->queries[0];

9

get_compiled_select実行前にクエリを出力できる新しいパブリックメソッドがあります。_compile_select現在は保護されているため、使用できません。

echo $this->db->get_compiled_select(); // before $this->db->get();

4
致命的なエラー:未定義のメソッドCI_DB_mysql_driver :: get_compiled_select()の
呼び出し


2

どちらlast_query()get_compiled_select()機能しないため、ペドロのコードを少し変更するだけで問題なく機能します。->get()ビルドに含めないでください-これは-> get()の前にある必要があります

 echo $this->EE->db->_compile_select();

1

@Chumillasの回答と@chhameedの回答を試してみましたが、SQLが間違っているため、機能しません。次のような新しいアプローチを見つけました

  • echo $sql; flush(); exit;前のreturn $sql; _compile_select関数に挿入DB_active_rec.php

0

印刷するクエリの直後にこの行を追加します。

例:

$ query = $ this-> db-> query( 'SELECT * FROM table WHERE condition');

//この行を追加します。

var_dump($ this-> db-> last_query());

出口();

または

echo $ this-> db-> last_query();


0

xdebugを使用して、VSCodeでこの値を監視し、それぞれの拡張子とCI v2.xを使用しています。私はexpresionを追加する$this->db->last_query()時計のセクションで、私は追加xdebugSettingslaunch.jsonで取得する非切捨て値のため、これらの線のようなノードを。

{
  "name": "Launch currently open script",
  "type": "php",
  "request": "launch",
  "program": "${file}",
  "cwd": "${fileDirname}",
  "port": 9000,
  "xdebugSettings": {
    "max_data": -1,
    "max_children": -1
  }
},

そして、ブレークポイントを使用してデバッガーを実行し、最後に式を選択して、右クリック>値をコピーします。


-1

私はまったく同じ問題を抱えていて、最終的に解決策を見つけました。私のクエリは次のように実行されます:

$result = mysqli_query($link,'SELECT * FROM clients WHERE ' . $sql_where . ' AND ' . $sql_where2 . ' ORDER BY acconame ASC ');

sqlコマンドを表示するには、クエリとまったく同じ内容の変数($ resultstring)を作成して、次のようにエコーするだけです。<?php echo $resultstring = 'SELECT * FROM clients WHERE ' . $sql_where . ' AND ' . $sql_where2 . ' ORDER BY acconame ASC '; ?>

できます!


これはCodeIgniterの方法ではありません。
mickmackusa

-1

get_compiled_select()クエリを置き換える代わりに取得するために使用します


この特定のケースで提案する関数の使い方を示すだけでなく、その使い方を示すことをお勧めします。
宜しくお願いし

-2

ここですべての回答を読みましたが、取得できません

echo $this->db->get_compiled_select();

動作するように、それは私にエラーを与えました、

行xxのコントローラーのコンテキスト 'Welcome'から保護されたメソッドCI_DB_active_record :: _ compile_select()を呼び出します

だから私protectedはファイルから以下の行から削除し\system\database\DB_active_rec.php、それはうまくいきました

protected function _compile_select($select_override = FALSE)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.