Beh... penso che dovresti fare un controllo delle variabili passate dalla form con il controllo isset(), quindi usare degli IF per compilare al volo la parte finale della query.

Per capirci:

Codice PHP:
$campo1 $_GET['campo1'];
$campo2 $_GET['campo2'];
$campo3 $_GET['campo3'];

$where_SQL "";

if (isset(
$campo1)) {
$where_SQL .= "campo1 = '$campo1' AND "
}

if (isset(
$campo2)) {
$where_SQL .= "campo2 = '$campo2' AND "
}

if (isset(
$campo3)) {
$where_SQL .= "campo3 = '$campo3'  AND "
}

if (isset(
$campo4)) {
$where_SQL .= "campo4 = '$campo4' AND "
}

// togli l'ultimo AND
$where_SQL substr($where_SQL, -14);

// aggiungi la stringa così composta
// a quella della query SQL

$sql "SELECT * from immobili WHERE $where_SQL";

// debug
echo $sql
Non l'ho provato, ma dovrebbe andare... ad ogni modo, ti ho messo anche una ECHO per vedere se la query è giusta.

In ultimo, la scelta della condizione AND o OR non deve essere condizionata dal fatto che la query funzioni o meno, ma da quello cui serve la query stessa.
Se c'è l'AND significa che per avere un risultato devono essere rispettate TUTTE le condizioni della query.