一般的なアプローチは、異なるクエリ部分を含む配列を作成し、フィルタリングする必要がある要素に応じて要素を追加することです。例:
<?php
$sql_parts = array(
'select' => array(),
'from' => array(),
'where' => array()
);
if ($filter_by_name != ''){
$sql_parts['select'][] = 'u.*';
$sql_parts['from'][] = 'users AS u';
$sql_parts['where'][] = "u.name = '".mysql_real_escape_string($filter_by_name)."'";
}
if ($filter_by_surname != ''){
$sql_parts['select'][] = 'u.*';
$sql_parts['from'][] = 'users AS u';
$sql_parts['where'][] = "u.surname = '".mysql_real_escape_string($filter_by_surname)."'";
}
//filter by data from another table
if ($filter_by_city_name != ''){
$sql_parts['select'][] = 'u.*, c.*';
$sql_parts['from'][] = 'cities AS c';
$sql_parts['from'][] = 'users AS u';
$sql_parts['where'][] = "c.cityname = '".mysql_real_escape_string($filter_by_city_name)."'";
$sql_parts['where'][] = "c.id = u.cityid";
}
$sql_parts['select'] = array_unique($sql_parts['select']);
$sql_parts['from'] = array_unique($sql_parts['from']);
$sql_parts['where'] = array_unique($sql_parts['where']);
$sql_query = "SELECT ".implode(", ", $sql_parts['select']).
"FROM ".implode(", ", $sql_parts['from']).
"WHERE ".implode(" AND ", $sql_parts['where']);
?>
これはうまくいく可能性があります。 key => valueを使用して、field => searchcriteriaにすることができます。長期的にはどれくらいのメリットがあるのかは分かりませんが...(LIKEや比較のように)より複雑なニーズが生まれても維持するのは面倒かもしれません。誰かが指し示すことができるライブラリがあるかもしれません。 – clifgriffin
[SQL Builder for PHP、JOINサポートは可能ですか?](http://stackoverflow.com/questions/216138/sql-builder-for -php-with-join-support) – Gordon