Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [sql]problem z OR
pawel81
post
Post #1





Grupa: Zarejestrowani
Postów: 110
Pomógł: 13
Dołączył: 28.04.2007

Ostrzeżenie: (0%)
-----


  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?

Ten post edytował pawel81 11.06.2007, 23:03:39
Go to the top of the page
+Quote Post
Darti
post
Post #2





Grupa: Zarejestrowani
Postów: 1 076
Pomógł: 62
Dołączył: 6.03.2005
Skąd: Wroc

Ostrzeżenie: (0%)
-----


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


--------------------
The answer is out there, Neo. It's looking for you. And it will find you, if you want it to.
SERVER_SOFTWARE : Apache/2.2.4 (Win32) PHP/5.2.1
MySQL Client API version : 5.0.27
Go to the top of the page
+Quote Post
pawel81
post
Post #3





Grupa: Zarejestrowani
Postów: 110
Pomógł: 13
Dołączył: 28.04.2007

Ostrzeżenie: (0%)
-----


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.

Ten post edytował pawel81 11.06.2007, 23:40:47
Go to the top of the page
+Quote Post
Darti
post
Post #4





Grupa: Zarejestrowani
Postów: 1 076
Pomógł: 62
Dołączył: 6.03.2005
Skąd: Wroc

Ostrzeżenie: (0%)
-----


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.


--------------------
The answer is out there, Neo. It's looking for you. And it will find you, if you want it to.
SERVER_SOFTWARE : Apache/2.2.4 (Win32) PHP/5.2.1
MySQL Client API version : 5.0.27
Go to the top of the page
+Quote Post
pawel81
post
Post #5





Grupa: Zarejestrowani
Postów: 110
Pomógł: 13
Dołączył: 28.04.2007

Ostrzeżenie: (0%)
-----


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.

Ten post edytował pawel81 12.06.2007, 00:05:35
Go to the top of the page
+Quote Post
Darti
post
Post #6





Grupa: Zarejestrowani
Postów: 1 076
Pomógł: 62
Dołączył: 6.03.2005
Skąd: Wroc

Ostrzeżenie: (0%)
-----


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)


--------------------
The answer is out there, Neo. It's looking for you. And it will find you, if you want it to.
SERVER_SOFTWARE : Apache/2.2.4 (Win32) PHP/5.2.1
MySQL Client API version : 5.0.27
Go to the top of the page
+Quote Post
pawel81
post
Post #7





Grupa: Zarejestrowani
Postów: 110
Pomógł: 13
Dołączył: 28.04.2007

Ostrzeżenie: (0%)
-----


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. ?>


Ten post edytował pawel81 12.06.2007, 00:28:05
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 21.08.2025 - 12:50