Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [sql]problem z OR
Forum PHP.pl > Forum > Przedszkole
pawel81
  1. <?php
  2. $qery = "SELECT u.login_uzytkownika, u.email_uzytkownika, z.login_uzytkownika, z.ema
    il_uzytkownika 
  3.  FROM uzytkownicy u, zamowienia z 
  4. WHERE (u.login_uzytkownika='$czyste_imie' OR u.email_uzytkownika='$czyste_nazwisko') 
  5. OR (z.login_uzytkownika='$czyste_imie' OR z.email_uzytkownika='$czyste_nazwisko')";
  6. $rezultat = mysql_query($qery) or die('Błąd 21'.mysql_error());
  7.  
  8.  
  9. #pierwsze zapytanie
  10. if ($rezultat && mysql_num_rows($rezultat) >0) {
  11. $blad['wypelnij'] = 'Podany użytkownik istnieje';
  12. rejestracja($pakiet, $blad);
  13. }
  14. ?>



W tym przypadku (jeżeli w bazie nie znajdują się login lub e-mail) mysql_num_rows($rezultat) zwróci liczbę wierszy w tabeli
  1. <?php
  2. WHERE (u.login_uzytkownika='$czyste_imie' OR u.email_uzytkownika='$czyste_nazwisko') 
  3. OR (z.login_uzytkownika='$czyste_imie' OR .email_uzytkownika='$czyste_nazwisko')";
  4. ?>


jeżeli zmienie na

  1. <?php
  2. WHERE (u.login_uzytkownika='$czyste_imie' AND u.email_uzytkownika='$czyste_nazwisko') 
  3. OR (z.login_uzytkownika='$czyste_imie' AND z.email_uzytkownika='$czyste_nazwisko')";
  4. ?>


zwróci 0 dlaczego?
Darti
AND oznacza logiczne i (oraz) czyli koniunkcję
OR oznacza lub czyli alternatywę
wychodzi z tego że tam gdzie masz same OR wystarczy że jeden warunek będzie spełniony a tam gdzie są dwa AND'y musi zaistnieć sytuacja, że dwa warunki zostaną spełnione równocześnie (te dwa połączone AND'em).
Poczytaj o logice matematycznej bo nie wiem jak to przełożyć na słowa
pawel81
Właśnie dlatego zastosowałem OR.
Jeżeli w bazie znajduje się Login lub e-mail wykonuje instrukcję

  1. <?php
  2. if ($rezultat && mysql_num_rows($rezultat) >0) {
  3. $blad['wypelnij'] = 'Podany użytkownik istnieje';
  4. rejestracja($pakiet, $blad);
  5. }
  6. ?>

jeżeli nie wykonuje instrukcje dodającą dane do bazy.
Problem tkwi w tym że chociaż nie ma Loginu i e-mail'a to wynikiem jest liczba wierszy w tabeli.
Darti
Cytat(pawel81 @ 11.06.2007, 22:13:55 ) *
jeżeli nie wykonuje instrukcje dodającą dane do bazy.
Problem tkwi w tym że chociaż nie ma Loginu lub e-mail'a to wynikiem jest liczba wierszy w tabeli.


OK, ale w przypadku zastosowania AND musi być login i email żeby zwróciło jakiekolwiek wiersze z tabeli uzytkownicy lub zamowienia (to lub to w zależności w której z tabel znalezione będą login i email równocześnie). Jak będzie pasował tylko login lub tylko email, to nie zwróci żadnego wyniku.
pawel81
jeżeli w jednym wierszu tabeli masz:

login: adas
e-mail: adas@aa.pl

w drugim

login: bartek
e-mail: bartek@aa.pl

to w przypadku gdy podasz

login: bartek
e-mail: adas@aa.pl

to
  1. <?php
  2. WHERE (u.login_uzytkownika='$czyste_imie' AND u.email_uzytkownika='$czyste_nazwisko') 
  3. OR (z.login_uzytkownika='$czyste_imie' AND z.email_uzytkownika='$czyste_nazwisko')";
  4. ?>
przepuści taki wpis a
  1. <?php
  2. WHERE (u.login_uzytkownika='$czyste_imie' OR u.email_uzytkownika='$czyste_nazwisko') 
  3. OR (z.login_uzytkownika='$czyste_imie' OR .email_uzytkownika='$czyste_nazwisko')";
  4. ?>
nie.

Więc w przypadku
  1. <?php
  2. WHERE (u.login_uzytkownika='$czyste_imie' OR u.email_uzytkownika='$czyste_nazwisko') 
  3. OR (z.login_uzytkownika='$czyste_imie' OR .email_uzytkownika='$czyste_nazwisko')";
  4. ?>

jeżeli w bazie nie ma takiego loginu lub e-maila mysql_num_rows($rezultat) powinien zwrócić 0 a nie liczbę wierszy w tabeli.
Darti
Dziwne, bo u mnie jest dokładnie odwrotnie.
mało tego, wynik w przypadku OR'ów będzie zawierał dane: adas | adas@aa.pl | bartek | bartek@aa.pl
(w przypadku AND nie będzie wyniku)
pawel81
alternatywny (OR), zwracajacy wartość 1 (prawda), jeżeli którekolwiek z wyrażeń jest prawdziwe

najprostszy przykład
  1. <?php 
  2. $a=2;
  3. $b=1;
  4.  
  5. echo(($a==1)or($b==2))?'prawda':'fałsz';
  6. ?>

wystarczy zamienić wartości zmiennych

a może nawiasy!

Mam! Nawiasy!

  1. <?php
  2. WHERE ((u.login_uzytkownika='$czyste_imie') OR (u.email_uzytkownika='$czyste_nazwisko')) 
  3.  OR ((z.login_uzytkownika='$czyste_imie') OR (z.email_uzytkownika='$czyste_nazwisko'))";
  4. ?>
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.