Вот пример как делать:
<? $city = isset($_GET['city']) ? $_GET['city'] : '' ?>
<select name="city" id="city" onchange="setCity(this.value, this)">
<option value="" <?= ($city == '') ? ' selected' : '' ?>>Город</option>
<option value="0" <?= ($city == '0') ? ' selected' : '' ?>>Все</option>
<?php foreach (getCityList() as $c) { ?>
<option value="<?php echo $c->id; ?>" <?= ($city == $c->id) ? ' selected' : '' ?>>
<?php echo $c->name; ?>
</option>
<?php if ($c->id == $params['city']) $temp_city = $c->name; ?>
<?php } ?>
</select>
И вроде вместо _GET у тебя в $params уже все лежит.
Скрытые инпуты убрать. JS весь убрать, кроме ajax-запроса. Не вижу ничего плохого в пустых GET-параметрах.