No to widzisz, różnica na poziomie pół sekundy w tym wypadku nie jest niczym strasznym. Jeśli chodzi o szybkość łącza, to to także nie powinno tu mieć znaczenia. Czemu? Bo wygląda na to, że nie ma dużej różnicy w szybkości pomiędzy wysyłaniem samych ID, a ID wraz z nazwami firm. Jeśli to drugie zajmie 10 sekund, to to pierwsze i tak zajmie niewiele mniej, np. 8 sekund. Więc myślę, że nie ma sensu się bawić w wyświetlanie samych ID. Tym bardziej, że takie coś to nie jedno, a dwa żądania. Czyli rozpatrując ten przykład (z liczbami wziętymi z powietrza :)), jeśli wyświetlisz od razu wszystko, to użytkownik zobaczy to po 10 sekundach. A możesz ewentualnie wyświetlić ID po 8 sekundach, a po dalszych 10 (!) wyświetlić również nazwy. Sumaryczny czas odpowiedzi -- tej użytecznej odpowiedzi -- jest więc dłuższy. Bardziej opłaca się nie "optymalizować".
Mam natomiast pewien pomysł na optymalizację i jedną ważną uwagę odnośnie skryptu PHP.
Jeśli wydajność byłaby jednak problemem, możesz spróbować w sprytny sposób generować bardziej optymalne zapytanie do bazy danych. Spójrz na to, jak wygląda ono teraz:
SELECT id FROM firmy WHERE nazwa='$nazwa' OR miasto='$miasto' OR woj='$woj' OR powiat='$powiat' OR kodpoczt='$kodpoczt' OR keywords1 LIKE '%$slowo%' OR keyword2 LIKE '%$slowo%' ";
Wyobraź sobie, że podano tylko miasto. Np. "warszawa" (btw. myślę, że pola typu string powinny być porównywane bez uwzględnienia wielkości liter, czyli żeby można było wpisać "warszawa", "Warszwa" itp.). W tym wypadku do bazy zostanie wysłane zapytanie (po podstawieniu zmiennych):
SELECT id FROM firmy WHERE nazwa='' OR miasto='warszawa' OR woj='' OR powiat='' OR kodpoczt='' OR keywords1 LIKE '%%' OR keyword2 LIKE '%%' ";
Widać od razu, że większość warunków jest niepotrzebnych. Mógłbyś sklejać zapytanie bardziej dynamicznie, warunkowo. Tzn. jeśli podano miasto, to dopiero wtedy doklejasz część o mieście. Nie podano kodu pocztowego, to nie doklejasz części warunku z kodem (OR kodpoczt='').
Troszkę tutaj będziesz miał problemów z tymi OR-ami, bo przed częścią warunku, która zostanie doklejona pierwsza, NIE powinieneś wstawić OR-a, tylko WHERE.
Możesz z tym sobie jednak w prosty sposób poradzić. Zrób sobie na przykład zmienną $cond (jak condition -- warunek) i ustaw ją na pusty string. Następnie, jeśli $miasto nie jest puste, doklej do niej "OR miasto='$miasto'". Podobnie zrób z pozostałymi zmiennymi. Teraz zmienna $cond albo będzie zupełnie pusta (jeśli nie podano żadnych danych), albo będzie miała postać "OR miasto='..' OR woj='....' [itd]", ewentualnie może być pusta gdy nie podano żadnych warunków. W drugim przypadku (jeśli nie jest pusta) widzisz, że zaczyna się od "OR", które jest niepotrzebne (przed pierwszym warunkiem powinno stać WHERE, a nie OR). Zrób więc -- uwaga, bo sposób typowo bamberski, że się tak wyrażę -- coś mniej więcej takiego:
$cond = '';
if ($miasto) {
$cond .= "OR miasto='$miasto'";
}
// i tak dalej dla innych pol
if ($cond != '') { // jesli podano jakies warunki
$cond = substr($code, 2); // wywal z $cond 2 pierwsze znaki, czyli OR
$cond = 'WHERE' . $cond; // dorzuc na poczatek WHERE
}
// zbuduj zapytanie
$query = 'SELECT id, nazwa FROM firmy ' . $cond;
Sposób trochę na pałę, ale nie będę Ci teraz tłumaczył jak napisać porządniejszy, obiektowy skrypt. Tym bardziej, że sama obiektowość nie zawsze jest taka fajna. Nie radzę przeklejać tego kodu, tylko ewentualnie zrozumieć o co mi chodzi i samemu go napisać, bo ja tego nawet nie pisałem w edytorze, o testowaniu nie wspominając. Mogą więc być tam błędy, czy literówki.
Tak w ogóle to w Twoim kodzie ze stałym zapytaniem (że zawsze dodajesz warunki dla miasta, województwa itd.) widać taki błąd, że jeśli gdzieś np. pole województwo przy jakiejś firmie będzie puste, to firma zostanie zwrócona jako wynik dowolnego zapytania, które nie będzie zawierało województwa. Bo w zapytaniu pojawi się fragment OR woj='', a woj w tym wypadku rzeczywiście będzie puste.
I na koniec poważniejsza sprawa. Bezpieczeństwo. Kolego, mam nadzieję, że unieszkodliwiasz (ang. escape) te wszystkie zmienne używane w zapytaniu? Podany przez Ciebie kod:
$firmy = $_POST['firmy'];
niestety na to nie wskazuje. To ekstremalnie niebezpieczne, jeśli w podobny sposób traktujesz zmienne wstawiane potem na żywca do zapytania do bazy danych. Takie coś jest podatne na (nie)sławny atak SQL Injection. Nie sprawdzałem, czy masz przed tym zabezpieczenia, czy nie, ale jeśli nie, to można Ci np. usunąć wszystkie rekordy z bazy danych.
Jeśli używasz bazy danych MySQL, to powinieneś przynajmniej każdą zmienną wysyłaną z formularza potraktować funkcją mysqli_real_escape_string. Czasami funkcja ta może nie być dostępna (musi być zainstalowane mysqli, "i" jak "improved"), w takim wypadku użyj mysql_real_escape_string (zauważ brak "i"). Powinno to wyglądać np. tak:
$miasto = mysql_real_escape_string($_POST['miasto']);
Mam nadzieję, że tę część o SQL Injection napisałem niepotrzebnie i że się przed tym zabezpieczyłeś, bo jeśli nie, to możesz mieć w kodzie parę poważnych i niebezpiecznych błędów. Ja niestety nie jestem wielkim specjalistą od backendu i tutaj najlepiej jakby pomógł Ci ktoś bardziej znający się na SZBD i PHP.</php>