Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [sql]problem z select
Forum PHP.pl > Forum > Przedszkole
pawel81
  1. "SELECT u.login_uzytkownika, u.haslo_uzytkownika, z.login_uzytkownika, z.haslo_uzytkownika, u.typ, z.typ
  2.  
  3. FROM uzytkownicy u, zamowienia z
  4.  
  5. WHERE (u.login_uzytkownika='$login' AND u.haslo_uzytkownika=password('$haslo')) OR (z.login_uzytkownika='$login' AND z.haslo_uzytkownika=password('$haslo'))")


Powyższe zapytanie sprawdza czy w tabeli uzytkownicy lub zamowienia istnieje podany login i hasło.
Problemem jest to że w wynikach zwracane są wartości z obu tabel (pola u.typ i z.typ ) a nie tylko z w wiersz i tabeli, w której został spełniony warunek.

Czy można jakoś sprawdzić, dla której tabeli został spełniony warunek?
Kamson
a jeśli warunek jest spełniony dla jednej i drugiej tabeli na raz?

jeśli warunek sprawdza się tylko dla jednej z tabel to daj 'GROUP BY u.login_uzytkownika, z.login_uzytkownika'
pawel81
Nic to nie dało
rasgan
a próbowałeś z SELECT DISTINCT, jeśli wartości się powtarzają zwraca tylko 1.
pawel81
Zobaczcie o co mi chodzi
  1. <?php
  2. $rezultat = mysql_query("SELECT u.login_uzytkownika, u.haslo_uzytkownika, u.typ, z.login_uzytkownika
    , z.haslo_uzytkownika, z.typ FROM uzytkownicy u, zamowienia z
  3.  
  4. WHERE 
  5. (u.login_uzytkownika='$login' AND u.haslo_uzytkownika=password('$haslo')) 
  6. OR 
  7. (z.login_uzytkownika='$login' AND z.haslo_uzytkownika=password('$haslo'))GROUP BY u.typ, z.typ")
  8.  
  9. or die("Błąd bazyn danych (LoI)".mysql_error());
  10.  
  11.  
  12. if ($rezultat && mysql_num_rows($rezultat) == 0){
  13.  $blad['logowanie'] = 'Błędny login lub hasło.';
  14.  logowanie($blad);
  15.  unset($_SESSION['c']);
  16. }
  17. elseif ($rezultat && mysql_num_rows($rezultat) >= 1)  {
  18.  
  19. $tablica = mysql_fetch_array($rezultat);
  20.  
  21. if(isset($tablica['typ'])) {
  22. if($tablica['typ'] == 'u') $_SESSION['tabela'] = 'uzytkownicy';
  23. elseif($tablica['typ'] == 'z') $_SESSION['tabela'] = 'zamowienia';
  24. else {
  25. }
  26. }
  27.  else session_destroy();
  28. ?>


za każdym razem z GROUP BY czy bez wartością $tablica['typ'] jest "z" niezależnie czy dane znajdują się w tej czy w tej tabeli
Darti
Rozbij to zapytanie na dwa odrębne (najpierw zapytaj w tabeli uzytkownicy i jak nie będzie wyniku to zapytaj w tabeli zamowienia). Reszta będzie już łatwa.
rasgan
a próbowałeś wyciągnąć dane z tabeli z użyciem AS?
Kod
select u.typ as UTYP, z.typ AS ZTYP
wtedy się możesz odwołać do $tablica['UTYP'] i $tablica['ZTYP'] ale głowy nie dam czy to zadziała.
pawel81
Miałem rozdzielone ale mnie pokusiło żeby złączyć sadsmiley02.gif
Darti
Cytat(pawel81 @ 13.06.2007, 11:15:31 ) *
Miałem rozdzielone ale mnie pokusiło żeby złączyć sadsmiley02.gif


Między tymi tabelami nie masz relacji żadnej, lepiej rozdzielić (ewentualnie tworzyć tablice tymczasowe w bazie i na nich sprawdzać)
pawel81
Udało się to zrobić w ten sposób
  1. <?php
  2. $rezultat = mysql_query("SELECT u.login_uzytkownika as U, u.haslo_uzytkownika, z.login_uzytkownika A
    S Z, z.haslo_uzytkownika FROM uzytkownicy u, zamowienia z
  3.  
  4. WHERE 
  5. (u.login_uzytkownika='$login' AND u.haslo_uzytkownika=password('$haslo')) 
  6. OR 
  7. (z.login_uzytkownika='$login' AND z.haslo_uzytkownika=password('$haslo')) GROUP BY u.login_uzytkownika, z.login_uzytkownika")
  8.  
  9. or die("Błąd bazyn danych (LoI)".mysql_error());
  10.  
  11. if ($rezultat && mysql_num_rows($rezultat) == 0){
  12.  $blad['logowanie'] = 'Błędny login lub hasło.';
  13.  logowanie($blad);
  14.  unset($_SESSION['c']);
  15. }
  16. elseif ($rezultat && mysql_num_rows($rezultat) >= 1)  {
  17.  
  18. $tablica = mysql_fetch_array($rezultat);
  19.  
  20.  
  21.  
  22. if($tablica['U'] == $login) $_SESSION['tabela'] = 'uzytkownicy';
  23. elseif($tablica['Z'] == $login) $_SESSION['tabela'] = 'zamowienia';
  24. else {
  25. }
  26. ?>


Waszym zdaniem lepiej będzie jeżeli rozdzielę to na dwa zapytania czy zostawię tak jak jest?
rasgan
Jak dla mnie to lepiej zostawić tak. Serwer wykonuje jedno zapytanie i 1 raz wysyła wyniki więc jest moim zdaniem szybciej.

Przy tak małych zapytaniach to naprawdę bez różnicy.
pawel81
u.login_uzytkownika as U w tym wypadku U jest "zmienna" czy nadaje jej nazwę?
Czy mogę jakoś stworzyć tablicę?

PS. Wielkie dzięki za podpowiedź!
rasgan
w tym wypadku U jest jakby drugą nazwą. Jakby skrótem (Win) czy dowiazaniem (jeśli wolisz linuksa).

Tabele się tworzy używając polecenia CREATE. Tabele tymczasowe się tworzy używająć create temporary table
pawel81
kapuje

czy można jakoś połączyć te zapytania

  1. <?php
  2. $zapytanie = "insert into zamowienia (id_zamowienia, login_uzytkownika, haslo_uzytkownika, 
  3. email_uzytkownika) values (NULL, '$czyste_login', password('$czyste_password'),
  4. '$czyste_email')";
  5.  
  6. mysql_query($zapytanie) or die("Błąd ZII");
  7.  
  8. $zapytanie = "select id_zamowienia from zamowienia where login_uzytkownika='$czyste_login'";
  9. $rezultat = mysql_query($zapytanie) or die("Błąd 24");
  10. $tablica = mysql_fetch_array($rezultat);
  11.  
  12. $zapytanie = "insert into zamowienia_dane (id_zamowienia, imie_uzytkownika, 
  13. nazwisko_uzytkownika, ulica_uzytkownika, nr_domu_uzytkownika, 
  14. nr_mieszkania_uzytkownika, miejscowosc_uzytkownika, telefon_uzytkownika, 
  15. pakiet, data) 
  16. values ('$tablica[id_zamowienia]', '$czyste_imie', '$czyste_nazwisko', 
  17. '$czyste_ulica', '$czyste_nr_domu', '$czyste_nr_mieszkania', 
  18. '$czyste_miejscowosc', '$czyste_telefon', '$pakiet', now())";
  19.  
  20. mysql_query($zapytanie) or die("Błąd ZIII");
  21. ?>
rasgan
Nie za bardzo, choć nie znam tak dobrze SQL żeby powiedzieć ci na pewno. Ale dla mnie to tak jakbyś chciał wywołać w PHP coś takiego:
Kod
echo $p+4=6;
pawel81
Lepiej zostawię tak jak jest
Darti
  1. INSERT INTO zamowienia_dane (id_zamowienia, imie_uzytkownika,
  2. nazwisko_uzytkownika, ulica_uzytkownika, nr_domu_uzytkownika,
  3. nr_mieszkania_uzytkownika, miejscowosc_uzytkownika, telefon_uzytkownika,
  4. pakiet, DATA)
  5. VALUES ((SELECT MAX(id_zamowienia) FROM zamowienia LIMIT 1), '$czyste_imie', '$czyste_nazwisko',
  6. '$czyste_ulica', '$czyste_nr_domu', '$czyste_nr_mieszkania',
  7. '$czyste_miejscowosc', '$czyste_telefon', '$pakiet', now())


Dzięki czemu linijki 8-10 nie są potrzebne
pawel81
dobre
  1. <?php
  2. values ((SELECT MAX(id_zamowienia) FROM zamowienia LIMIT 1),
  3. ?>


ale gdyby było kilka żądań do bazy w tym samym momencie to czy nie mogło by pomieszać id
rasgan
nie powinno namieszać. Serwer SQL ma zabezpieczenia przed tym. Nie pamiętam nazwy ale chodzi o to, że kolejna operacja zapisu jest rozpoczęta po zakończeniu poprzedniej.
Darti
To ewentualnie zamień na
Kod
SELECT id_zamowienia FROM zamowienia WHERE login_uzytkownika='$czyste_login' LIMIT 1

ale w tym przypadku jak użytkownik ma kilka zamówień to może namieszać w poprzednich zamowieniach
pawel81
może złożyć tylko jedno zamówienie jedynie co może namieszać to odświeżanie w firefox'ie
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.