読者です 読者をやめる 読者になる 読者になる

事務員、プログラマーになる

事務員がプログラマーになりました。

SQLの「?」と戦う① 問題点編

CodeIgniter3

作っているのは社内用のシステムで90画面ぐらいある中の8画面がすでに作成されていました。
環境はPHPでCodeIgniter3というフレームワークが使用されています。

この辺の資料は、去年の11月ぐらいに中途で入ってわずか2週間で辞めた女性が残してくれていました。
感謝感謝(辞めたくなる気持ち、わかるよ)

最初に作るのは検索機能です。
「オマエがうるさいから検索条件いっぱい用意してやったから」
と言われるだけあって、設計書を見ると検索結果が画面外に出るようなことになってましたが
「いらないし邪魔なんで^^」と削除。
笑顔溢れるストレスフルな職場です☆

検索するためにはSQLというのを書かないといけないのですが、私が書こうとしたのがこんな感じ。

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

$bindsに入っている値が前から順番に$sqlの?部分に置き換えられて実行されるらしいです。
ここで問題が発生。
私が欲しい検索条件は15個ぐらいあるんです(オッサンに邪魔とか言ったのに結局欲張った)
でも検索条件って毎回全部入力するわけじゃないじゃないですか。
そんな時にはWHEREに入れてほしくないんですが、ここをどういう風に書けばそうなるのかがわからなくて…。

無い知恵絞って考えついたSQL

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

これによって同じ検索条件を2回ずつ渡す必要が発生。
結果、$_bindsの中身がズレたり足りなかったり、直したくてもどれがなんだかわからなくなったり。
困った挙句にteratailというところで質問させてもらいました。
teratail.com

世の中は初心者に優しい。
回答で情報を頂いたおかげで、無事に:id方式(シンボルというらしい?)に改造することができました。
備忘録を兼ねて、まずはそのことを書いておこうと思います。

※ちなみに既に開発済みだった8画面は、どうもCodeIgniter3の仲間に入っていないようです。
 ControllerもModelもなく1つのPHPファイルにバーーー!!と全部の処理が書いてあるようです。
 が、この時点の私は全部のソースがCodeIgniterの仲間だと思っています。