SQL文の生成 このエントリをはてなブックマークに>追加

前にも書いたが、最近他人のコードを見る機会が多い。中でも気になるのが次のようなコード。

$sql = "select * from some_table ";
if ($pref != "") {
	if ($flag) {
		$sql .=  "AND pref='$pref' ";
	} else {
		$sql .=  "WHERE pref='$pref' ";
		$flag = true;
	}
}
if ($zip != "") {
	if ($flag) {
		$sql .=  "AND zip='$zip' ";
	} else {
		$sql .=  "WHERE zip='$zip' ";
		$flag = 1;
	}
}
// 以下条件文の追加が続く

驚いたことに、「既に条件文が追加されたかどうか」のフラグを立てておいて、フラグが立っていなければWHERE句を起こし、立っていればANDで繋ぐという解法を取っている。しかもこの手のコードを見たのは一度ではない。少なくとも3人のコード中で見かけた(ということは同じ書き方をしている人がもっと沢山いるということだ)。

AND条件と決まっているのなら、次のように配列を作って繋いだ方がいい。カラム指定やFROM句なども同じ。「*」は原則として使わない。

$where_cond = array();
if ($pref != "")$where_cond[] = "pref = '$pref'"; // サニタイズはお忘れなく
if ($zip != "") $where_cond[] = "zip = '$zip'";
// 以下条件文の追加が続く

if(! count($where_cond))return false ; // 条件の指定がなければ失敗
$where = join(' AND ', $where_cond); // WHERE句生成
$sql = "SELECT some_column FROM some_table WHERE $where"; // SQL文生成

3 件のコメント - “SQL文の生成”

  1. Craftworks のコメント

    私も配列作って後で繋げてます。しかもそっちの方がコードも短くなりますよね。
    こういうところにも PG に向いてる向いてないが出る気がするのは気のせいでしょうか。

  2. かなだ のコメント

    > 私も配列作って後で繋げてます。しかもそっちの方がコードも短くなりますよね。

    うん。俺もそれが普通だと思ってたから、ちょっと驚いている。

    > こういうところにも PG に向いてる向いてないが出る気がするのは気のせいでしょうか。

    それはあるかも。もちろん意図的に例のようなコードを書く場合もあるのだろうけど、これに全く違和感覚えない人は危機感持った方がいいと思う。

  3. Ryosuke のコメント

    こーいう人もいる模様
    $sql = “SELECT … FROM … WHERE 1″;
    if ($pref != “”) $sql .= ” AND pref = ‘$pref’”;
    if ($zip != “”) $sql .= ” AND zip = ‘$zip’”;
    # やさぐれSQL?
    しかしphpってなかなか配列が便利ですよね

コメントをどうぞ。

使用できる XHTML タグ : <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <code> <em> <i> <strike> <strong>