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

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

ただいまの
回答率

92.00%

  • PHP

    11607questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • CodeIgniter

    174questions

    CodeIgniterは、PHP向けオープンソースのWebアプリケーションフレームワークです。CodeIgniterは覚える構文が少なく、自由度も高いため、PHPを理解していれば構築が簡単です。

PHP(CodeIgniter3)SQLの検索条件置き換えを「?」以外にしたい

解決済

回答 1

投稿 2017/02/14 16:28

  • 評価
  • クリップ 0
  • VIEW 154

SystemAjisai

score 4

前提・実現したいこと

PHP7(CodeIgniter3)で検索画面を作っています。

テーブルの結合が複雑で検索条件も多いため、
↓こういう書き方ではなく

$this->db->from('table1');
$this->db->where('id', 'user123');


↓こういう風に書こうとしています。

$_sql = "select * from table1 where id = ? ";
$_binds = array('user123');
$this->db->query($_sql, $_binds)

ネットで調べると、SQL内の「?」で置き換えている箇所が、
JavaやRubyという言語では

select * from table1 where id = :id


のように、「:」+任意の名前でマーキングできるようでした。

PHP(CodeIgniter)では同じことはできないのでしょうか。
こうすればできるよ 等があれば教えてください!

発生している問題・エラーメッセージ

検索条件が多いため「?」が大量になってしまい、
どこがなんの値で置き換えられているのか、非常に読みづらい。

試したこと

$this->db->query()の本体と思しき、DB_driver.phpのqueryファンクションを読んでみました。
同じファイルの内のcompile_bindsファンクションが「?」の置き換え処理で、
マーカーとして「?」しか定義されてなかったので、queryファンクションではやりたいことは実現できないのではないかと思っています。
そこでMY_DB_driver.phpを作ってオリジナルのcompile_bindsファンクションを書いてみました。
$this->db->query()でオリジナルのcompile_bindsが呼び出されると思ったのですが、誰からも呼んでもらえませんでした。

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

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

    クリップした質問はマイページの「クリップ」タブからいつでも見ることができます。

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正の依頼

  • SystemAjisai

    2017/02/14 17:58

    書いててバカなことを言ってる気がしてきました。継承クラス作ったら親クラスの挙動だけ入れ替わるとか神秘現象ですよね。MYはDB_driverじゃなくてそのアプリケーションという解釈の方が正しい気がしてきたので、どっちにしろ他に影響しそうなことしてました…。

    キャンセル

  • kunai

    2017/02/14 18:09

    勿論、影響があって困る本番環境などではやらない方が良いと思いますが。まずは自分だけが扱う開発専用環境等を作って、そこで上書きでやってみたらどうでしょう。

    キャンセル

  • SystemAjisai

    2017/02/15 08:12

    ありがとうございます。今回の件で自分のパソコンで試せないって不便だなと感じたので、開発環境に挑戦して試してみます!

    キャンセル

回答 1

checkベストアンサー

0

普通に sql 文作って、配列なりオブジェクトで値を渡してあげれば出来たはずです。
ただ、普通のPHPとは違い

$_sql = "select * from table1 where id = :id ";
$array = [
'id' => $id,
];


のように:を取った形で、作ってやる必要があったと思います。
*手元で確認してません^^;間違ってたらすみません。

また、CodeIgniter は制約が緩いので、ナマの PHP が使えます。
クエリビルダを使うのがしんどければ、PDO とかでやるとイイです。

PDO::prepare
やりたいことは普通に実現可能です。

拡張に関しては、こちらが参考になるかと
あずみ.net

投稿 2017/02/14 23:11

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

    以下のような回答は評価を下げられます

    • 間違っている回答
    • 質問の回答になっていない投稿
    • 不快な投稿

    評価を下げる際はその理由をコメントに書き込んでください。

  • 2017/02/15 08:58

    回答ありがとうございます。
    私のやり方が悪いのか、:idの置き換えが行われずそのままSQL実行され、「You have an error in your SQL syntax」という構文エラーになってしまいました。

    PDOに関して自分なりに調べてみたのですが、config/database.phpのDB接続設定のdbdriverを現在のmysqliからpdoに変えないといけないようで、ほかに影響が出たら怖いので自分の開発環境ができてから試してみたいと思います。
    ↓参照したところ
    https://forum.codeigniter.com/thread-62163.html

    拡張の情報も参考になりました!
    MY_ControllerやMY_Modelが作れたので同じように考えていましたが
    これらは継承するから動くわけで、呼び出してるだけのドライバークラスはロードする対象を拡張クラスにしないと呼び出されないんですね。
    なんで考え付かなかったんだろう…お恥ずかしい限りです。
    ただこちらも私の壮大な勘違いで、他への影響が出る可能性がある修正だったので、自分の環境を作れてから試したいと思います。

    取り急ぎ上司から早くしろとせっつかれているので、
    「試したこと」で作ってみた自前の置き換えファンクションをモデルにコピーして、
    query()に渡すSQLを自前ファンクションで置き換え後のものにする方法で一時しのぎすることにしました。
    (普段から俺スキル自慢するくせに、開発経験5日の私に押し付けるな言いたいッ!…という愚痴)
    なんかカッコ悪い気がするので、自分の環境が作れたら拡張とPDOも試してコッソリ置き換えてみます!
    ありがとうございました!!

    キャンセル

  • 2017/02/15 09:23

    すみません。手元のコード見ると、全て
    $this->db->where('id', 'user123');
    みたいにして使ってました。
    ちょっと、insert とかとゴッチャになって間違った情報を書いてしまったようです。
    *やはりちゃんと検証してからかけばよかった。。。急ぎの時にお手数をおかけしました。

    業務で使用するなら、生 PHP は使用しないほうが良いですね^^;
    メンテが面倒くさくなるので。

    なんか全然役に立たない回答してしまいすみませんでした。

    キャンセル

  • 2017/02/15 12:05

    とんでもないです!
    エラーでも出ればそれを元に調べられるんですが、今回のはなんてキーワードで調べればいいかもわからず途方くれていたので、本当に助かりました。

    先ほど自分のパソコンに環境ができたので試しに拡張版で書いてみました。
    私が調べていたCI_DB_driverを拡張したのでは、$this->db->~で呼び出す一部の機能が使えなくなってしまいました。
    もともと開発中の環境ではDB_query_builder というのが使われていたようでDB_query_builder はDB_driverを継承していました。

    長くなりましたが、結論は
    DB_query_builderを継承したMY_DB_query_builder を作ってcompile_bindsの処理に「:」形式の置換処理を足し、Load処理を拡張してMY_DB_query_builderを読み込んだらOK!
    でした。
    この辺も教えて頂いたサイト様を参考にさせて頂きました。

    色々勉強になり、また理想通りにもなって幸せです。
    ありがとうございました!!

    キャンセル

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

ただいまの回答率

92.00%

関連した質問

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

  • PHP

    11607questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • CodeIgniter

    174questions

    CodeIgniterは、PHP向けオープンソースのWebアプリケーションフレームワークです。CodeIgniterは覚える構文が少なく、自由度も高いため、PHPを理解していれば構築が簡単です。

閲覧数の多いPHPの質問