[php] wyszukiwanie zaawansowane

0

witam mam sobie baze.
i w niej sa dwie tabelki: users i personal
teraz potrzebne mi zaawansowane wyszukiwanie osob.
no w tabelce users jest
nick , email, itd
a w tabelce personal jest
imie,adres, tefelfon

Teraz potrzebuje wyszukac ludzi po dowolnym polu np po telefonie
ale tez moze ktos nie dac telefonu tylko np po emailu
to jak skonstruowac zapytanie MySQL

SELECT * FROM users,personal WHERE email='[email protected]' OR telefon='603098838'

to mi nie dziala jak to zrobic

0

Ale działa na pewno to:

SELECT * FROM users personal WHERE email='[email protected]' OR telefon='603098838'

0

Przede wszystkim nie widze sensu istnienia dwoch tabel. Ja bym polaczyl obydwie w jedna calosc, ktora zawiera po prostu informacje o uzytkownikach (takze te szczegolowe).

Hmm... ja bym to zrobil w ten sposob. Masz formularz do filtrowania, w nim pola: "imie", "nazwisko", "email", "telefon". W skrypcie sprawdzasz ktore pola zostaly wypelniona i dolaczasz odpowiedni fragment zapytania do bazowego zapytania SQL. Np.:

$sql = 'SELECT * FROM users';

if ( !empty($_POST['imie']) ) 
{
    $sql = append_sql($sql, 'imie', $_POST['imie']);
}

if ( !empty($_POST['email']) ) 
{
    $sql = append_sql($sql, 'email', $_POST['email']);
}

{ i tutaj kilka warunkow }

Teraz w funkcji append_sql:

      function append_sql($sql, $key, $value, $operator = '=')
      {
          /* sprawdz czy zapytanie posiada warunek WHERE */
          if ( !strpos($sql, 'WHERE') )
          {
              /* jezeli nie - doklejamy warunek WHERE */
              $sql .= ' WHERE ';
          }
          else
          {
              /* w przeciwnym razie - doklejamy AND */
              $sql .= ' AND ';
          }
          
          /* warunek sprawdza czy parametr $value jest lancuchem */
          if ( is_string($value) )
          {
              /* warunek sprwdza typ operatora (parametr $operator) */
              if ( $operator == 'LIKE' )
              {
                  /* nakladanie maski */
                  $value = '%' . $value . '%';
              }
              $value = '"' . mysql_escape_string($value) . '"';
          }

          /* doklejamy do zapytania i zwracamy rezultat */
          return ( $sql .= "$key $operator $value" );
      }
      

Mniej wiecej tak to powinno wygladac. Oczywiscie pomijam tutaj kwestie bezpieczenstwa, czyli zabezpieczenie sie przed SQL Injection.

0

Czyli w zasadzie moge polaczyc te dwie tabelki nie bedzie to mialo wplywu na mniejsza wydajnosc przeszukiwania itd ?

p.s. dziekuje za powyzszy kod

0

Nie. Dodatkowo mozesz nalozyc indeksy na pola ktore beda przeszukiwane, co powinno poprawic predkosc.

0

co to sa te indexy ?jak to wykorzystac?

0

Przyspieszaja dzialanie operacji typu SELECT. Ale o tym mozesz poczytac w manualu MySQL (http://www.mysql.com/doc).

0

Indeksy do dodatkowe pole z numerowaniem kazdej dodanej osoby jak masz dostęp do phpmyadmin to ustawiasz dodatkowe pole najlpiej przed wszystkimi innymi (na początku) i ustwiasz parametr tabeli jako podstawowy i dajesz auto_increment (czyli automatyczna numeracja wtedy pola mogą sie powtarzać).
ort! łatwo się odwołać do szerszej informacji na temat danej osoby poprzez id wpisu!

0

Aajj tam, glupoty gadasz :/
Indeksy, ogolnie przyspieszaja dzialanie operacji typu SELECT. Minusem jest w takim wypadku wiekszy rozmiar tabeli. Indeksy (w tym wypadku mowie o indeksie INDEX) nakladamy na kolumn(e/y) na ktorych beda dokonywane operacje wyszukiwania. Czyli w tym wypadku mozesz nalozyc indeksy na kolumny przechowujace imie, nazwisko oraz np. nr. tel.

0

Widocznie źle to wytłumaczyłeś!

0

Daniel to co ty mowisz to jest KLUCZ podstwowy to musi miec kazda tabela
a indexy to wlasnie czytalem w DOC ale jeszcze sie za bardzo w tym nie umiem pruszac :) ALE SIE NAUCZE MUSZE :)

0

Rozumie myslałem ze np Imie bąć nazwisko jest u ciebie kluczem podstawowym!

0

W sprawie indeksów... od razu zaznaczę, że jeśli w tabeli często pojawiają się nowe rekordy bądź zmieniane są dane w kolumnie z indeksem, to trwa to dłużej - indeks musi zostać odbudowany.

Więc jeśli już je zakładasz, to tylko tam, gdzie są naprawdę potrzene.

0

I nieprawda ze klucz podstawowy musi byc w kazdej tabeli. To tak BTW.

1 użytkowników online, w tym zalogowanych: 0, gości: 1