質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.43%

  • Laravel 5

    2189questions

    Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

  • Laravel

    741questions

    LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

DB::select等の実行SQLを取得する方法はありますか

解決済

回答 2

投稿

  • 評価
  • クリップ 5
  • VIEW 22K+

red13

score 71

$results=DB::select('select * from users where id=?',['1']);
という実装の場合に、
文字列で「select * from users where id=1」のような実行SQLを取得する方法はありますか?
ある場合、DB::insertやDB::updateも同じ方法で取得できますか?

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

+7

すでに解決したことになっていますが、Laravelの場合だとEloquentを使っている場合であれば取得可能です。また、クエリビルダでも実行後であれば実行されたSQLが取得できます!

Eloquentの場合だと、getメソッドで取得してくる部分をtoSqlメソッドに切り替えることで実際に実行されるSQL文を取得することが出来ます。

User::where('id',1)->toSql();

実行後のクエリを見るためには、先にそのメソッドを実行する前に

DB::enableQueryLog();

を記述した上で、実行後にDB::getQueryLog()メソッドを利用することで、そのクエリの内容や、かかった時間等を取得することが可能です!

DB::enableQueryLog();
$results=DB::select('select * from users where id=?',['1']);
dd(DB::getQueryLog());

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/02/06 14:56

    そういう機能があるのですね。
    今度見てみます。

    キャンセル

checkベストアンサー

+1

「select * from users where id=1」のような一本の文字列のSQL文は、処理のいかなる段階でも発生していません。それはRDBの中ででもです。
「select * from users where id=?」という未完成なSQL文がRDBに渡され、そのままコンパイルされ、その後に1というデータが渡されてコンパイル結果に適用されるという流れになります。
このような扱いをしているからこそSQLインジェクションが防げます。
「select * from users where id=1」という文字列がどこかで生成されているとしたら、それはとてもまずいことです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/02/05 10:21

    デバッグ等で確認したい場合は自作しなければならないのですね。

    キャンセル

  • 2016/02/05 11:01

    その通りです。
    あと、「未完成なSQL(プリペアドステートメントと呼びます)」自体がクエリビルダにどう構築されたかを確認したい場合は、RDB側のクエリログをとるのが有効です。

    キャンセル

  • 2016/02/05 11:54

    横からすみません、PHPは全く触ったことがなく聞きかじりの知識しかないので見当はずれかもしれないのですが…
    PHP(PDO?)では、下記リンク先が言うところの「動的プレースホルダ」がデフォルトで有効(エミュレーションがON)なので、PHPアプリケーション側で「select * from users where id=1」というクエリを生成してDBに投げているのではと考えていたのですが、これは誤った認識でしょうか?(少なくとも設定によってはあり得るのかな、と思っていたのですが)
    http://qiita.com/7968/items/7ddd59b94eb5a4fb6eaf

    キャンセル

  • 2016/02/05 12:02

    あー、動的プレースホルダ、その可能性がありますか。
    動的プレースホルダ自体、ライブラリ側に考慮漏れがあると脆弱性ができてしまうので方式そのものがお薦めできない(だから回答中でも「とてもまずいこと」としています)やつなんですが、PDOがそうでしたね。

    PDOと同じようになっているかどうかは、やはりRDB側のクエリログを読むことで確認できます。

    キャンセル

同じタグがついた質問を見る

  • Laravel 5

    2189questions

    Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

  • Laravel

    741questions

    LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。