Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]Sprawdzenie czy 2 wartości istnieją w bazie
Forum PHP.pl > Forum > Przedszkole
Turson
Piszę skrypt rejestracji i ma sprawdzić, czy w bazie danych istnieje już login jaki podał użytkownik oraz czy jest już tam taki e-mail.

  1. if(mysql_query("SELECT login FROM users WHERE login=$login") OR mysql_query("SELECT mail FROM users WHERE mail=$mail"))
  2. {
  3. echo 'Konto z takim loginem lub adresem e-mail już istnieje.';
  4. }
  5. else
  6. {
  7. /* OK */
  8. }

Ale działa to źle. Podam:
istniejący już login + nowy mail = info o błędzie
nowy login + istniejący mail = bez błędu
Greg0
A co z kombinacjami
istniejący już login + istniejący mail
nowy login + nowy mail
Bo na dobrą sprawę na razie wystarczy ci sprawdzić tylko login smile.gif
widmo_91
  1. $wp = mysql_query("SELECT login FROM users WHERE login=$login OR mail=$mail");
  2. {
  3. echo 'Konto z takim loginem lub adresem e-mail już istnieje.';
  4. }
  5. else
  6. {
  7. /* OK */
  8. }
Turson
@widmo_91
Istniejący login + istniejący mail PRZECHODZI
widmo_91
Jeżeli OK jest jak: nie ma loginu i nie ma email albo jest login i jest email to:

  1. mysql_query("SELECT login FROM users WHERE login=$login XOR mail=$mail");
  2. {
  3. echo 'Konto z takim loginem lub adresem e-mail już istnieje.';
  4. }
  5. else
  6. {
  7. /* OK */
  8. }
Turson
Nie, nie o to chodzi. Ma być:
Istniejący login + nowy mail = FALSE
Nowy login + istniejący mail = FALSE
Istniejący login + istniejący mail = FALSE
Greg0
1.
Cytat
istniejący już login + nowy mail = info o błędzie
nowy login + istniejący mail = bez błędu


2.
Cytat
Istniejący login + nowy mail = FALSE
Nowy login + istniejący mail = FALSE


Zdecyduj się i wypisz wszystkie kombinacje + dla których ma być błąd, a dla których nie
Turson
Pomyliłem się.

Ma przejść tylko w jednym przypadku - gdy żadna z wartości nie widnieje jeszcze w bazie. Inne opcje mają dać błąd.
widmo_91
No to masz odpowiedź w pierwszym moim poście w tym temacie.
Turson
Nie do końca. Jeśli sprawdzę login i nie ma takiego w bazie, to skrypt założy nowe konto, a tymczasem jest jeszcze druga wartość do sprawdzenia, która nie może w tejże bazie być.

istniejący login+nowy mail=FALSE
istniejący login+istniejący mail=FALSE
nowy login + istniejący mail = FALSE

nowy login+nowy mail=TRUE

Czyli jeśli przynajmniej jedna z wartości login lub mail istnieje w bazie skrypt ma nie przepuścić tego
widmo_91
Rezygnuję z dalszych wyjaśnień, zagadnienie mnie przerosło facepalmxd.gif
Turson
Wymyśliłem dziwną alternatywę...
  1. $valid=0;
  2.  
  3. if(mysql_query("SELECT login FROM users WHERE login=$login"))
  4. {}
  5. else
  6. {
  7. $valid++;
  8. }
  9.  
  10. if(mysql_query("SELECT mail FROM users WHERE mail=$mail"))
  11. {}
  12. else
  13. {
  14. $valid++;
  15. }
  16. if($valid)==2)
  17. {
  18. /* zakłada konto */
  19. }
  20. else
  21. {
  22. echo "Login lub haslo istnieje";
  23. }


Ma to racje bytu?
widmo_91
Wcale nie ma to racji bytu.
Gratuluje udziwnienia zacznijmy od tego, że mysql_query nie zwraca liczby wyników!!! Zwraca zasób i jeżeli zapytanie jest poprawne to zawsze da true, polecam zainteresować się mysql_num_rows()
Turson
Nie założyłem, że mysql_query zwraca liczbę wyników.

Jeśli login nie istnieje $valid++, jeśli mail nie istnieje $valid++
o to chodziło
widmo_91
wiem o co chodziło ale mysql_query dla selecta zawsze zwróci true jeżeli zapytanie jest poprawne a niekoniecznie zapytanie musi zwracać jakieś wyniki.
Napisałeś to samo co 1 poście tylko 3 razy dłużej i 9 razy bardziej skomplikowanie.
Poza tym zamiast:
  1. if(mysql_query("SELECT login FROM users WHERE login=$login"))
  2. {}
  3. else
  4. {
  5. $valid++;
  6. }


Polecam:
  1. if(!mysql_query("SELECT login FROM users WHERE login=$login"))
  2. $valid++;
Turson
Rozwiązanie było jednak banalne...

  1. if(mysql_query("SELECT login FROM users WHERE login=$login")==FALSE)
  2. {
  3. if(mysql_query("SELECT mail FROM users WHERE mail=$mail")==FALSE)
  4. {
  5. echo 'Konto z takim adresem e-mail już istnieje.<br><a href="index.php?page=rejestracja">-Powrót-</a>';
  6. }
  7. else
  8. {
  9. mysql_query("INSERT INTO users VALUES (null, '$login', '$mail', '$password', 0, 0)") or die(mysql_error());
  10. $lh = $login . $password;
  11. $md5 = md5($lh);
  12. mysql_query("INSERT INTO kod_aktywacyjny VALUES ('$login', '$md5')") or die(mysql_error());
  13. echo "Konto zostało założone.";
  14. }
  15. }
r4xz
@TursoN: nadal nie rozumiesz...
Cytat
Return Values

For SELECT, SHOW, DESCRIBE, EXPLAIN and other statements returning resultset, mysql_query() returns a resource on success, or FALSE on error.

For other type of SQL statements, INSERT, UPDATE, DELETE, DROP, etc, mysql_query() returns TRUE on success or FALSE on error.

The returned result resource should be passed to mysql_fetch_array(), and other functions for dealing with result tables, to access the returned data.

Use mysql_num_rows() to find out how many rows were returned for a SELECT statement or mysql_affected_rows() to find out how many rows were affected by a DELETE, INSERT, REPLACE, or UPDATE statement.

mysql_query() will also fail and return FALSE if the user does not have permission to access the table(s) referenced by the query.

mysql_query
Turson
  1. if(mysql_query("SELECT login FROM users WHERE login=$login"))
  2. {
  3. //jeśli istnieje
  4. }
  5. else
  6. {
  7. // jeśli nie istnieje
  8. }

Więc nie działa to tak? Nie sprawdzam ile jest wartości, ale czy istnieje w ogole
widmo_91
Ty sprawdzasz czy zapytanie jest poprawne a nie czy istnieje taki login w bazie.
Ja nie wiem jak ty sprawdzasz poprawność swojego kodu :|
Powtórzę ostatni raz poprawne rozwiązanie masz w 3 poście w tym temacie.
Turson
Sprawdzałem wszystkie kombinacje i działa prawidłowo...

Oto cały kod:
  1. <?PHP
  2.  
  3.  
  4.  
  5. if(isset($_POST['submit']))
  6. {
  7. $login = mysql_real_escape_string(htmlspecialchars($_POST["login"]));
  8. $mail = mysql_real_escape_string(htmlspecialchars($_POST["mail"]));
  9. $password = md5($_POST["password"]);
  10. $password2 = md5($_POST["password2"]);
  11. $kod = $_POST["kod"];
  12. $wylosowany = $_POST["wylosowany"];
  13.  
  14. if(!empty($login) && !empty($mail) && !empty($password) && !empty($password2) && !empty($kod))
  15. {
  16. if(($password)==($password2))
  17. {
  18. if(strlen($login)>2 && strlen($password)>4)
  19. {
  20. if(($wylosowany)==($kod))
  21. {
  22. if(mysql_query("SELECT login FROM users WHERE login=$login")==FALSE)
  23. {
  24. if(mysql_query("SELECT mail FROM users WHERE mail=$mail")==FALSE)
  25. {
  26. echo 'Konto z takim adresem e-mail już istnieje.<br><a href="index.php?page=rejestracja">-Powrót-</a>';
  27. }
  28. else
  29. {
  30. mysql_query("INSERT INTO users VALUES (null, '$login', '$mail', '$password', 0, 0)") or die(mysql_error());
  31. $lh = $login . $password;
  32. $md5 = md5($lh);
  33. mysql_query("INSERT INTO kod_aktywacyjny VALUES ('$login', '$md5')") or die(mysql_error());
  34. echo "Konto zostało założone.";
  35. }
  36.  
  37. }
  38. else{echo 'Konto z takim loginem już istnieje.<br><a href="index.php?page=rejestracja">-Powrót-</a>';}
  39. }
  40. else
  41. {
  42. echo 'Błędnie przepisany kod z obrazka<br><a href="index.php?page=rejestracja">-Powrót-</a>';
  43. }
  44. }
  45. else
  46. {
  47. echo 'Login lub hasło są za krótkie<br><a href="index.php?page=rejestracja">-Powrót-</a>';
  48. }
  49. }
  50. else
  51. {
  52. echo 'Hasła nie są takie same<br><a href="index.php?page=rejestracja">-Powrót-</a>';
  53. }
  54. }
  55. else
  56. {
  57. echo 'Nie zostały uzupełnione wszystkie pola formularza.<br><a href="index.php?page=rejestracja">-Powrót-</a>';
  58. }
  59. }
  60. else
  61. {
  62. /* Kod z obrazka */
  63. $l1 = rand(1,9);
  64. $l2 = rand(1,9);
  65. $l3 = rand(1,9);
  66. $l4 = rand(1,9);
  67. $l5 = rand(1,9);
  68. $losuj_kod = $l1 . $l2 . $l3 . $l4 . $l5;
  69. echo "
  70. <form action='index.php?page=rejestracja' method='post'>
  71. <table style='width:400px;margin:0;padding:0;background:none;border-spacing:0px;'>
  72. <tr style='margin:0;padding:0;background:none;'><td class='rej_td'>Login</td><td><input type='text' name='login' class='logowanie_form' maxlength=20></td><td class='rej_info'>(min. 3 znaki)</td></tr>
  73. <tr style='margin:0;padding:0;background:none'><td class='rej_td'>Adres e-mail</td><td><input type='text' name='mail' class='logowanie_form' maxlength=40></td></tr>
  74. <tr style='margin:0;padding:0;background:none'><td class='rej_td'>Hasło</td><td><input type='password' name='password' class='logowanie_form' maxlength=20></td><td class='rej_info'>(min. 5 znaków)</td></tr>
  75. <tr style='margin:0;padding:0;background:none'><td class='rej_td'>Powtórz hasło</td><td><input type='password' name='password2' class='logowanie_form' maxlength=20></td></tr>
  76. <tr style='margin:0;padding:0;background:none'><td></td><td><div class='obrazek'>";
  77. $img=ImageCreateFromJPEG('images/kod_bg.jpg');
  78. $kolor_bialy = ImageColorAllocate($img, 234, 0, 11);
  79. $nazwa = "nazwa.jpg";
  80. ImageFill($img, 0, 0, 0);
  81. ImageString($img, 5, 60, 15, $losuj_kod, $kolor_bialy);
  82. imagepng($img, $nazwa);
  83. ImageDestroy($img);
  84. echo "<img src=\"$nazwa\" alt=\"Wygenerowany obrazek\" />";
  85. echo "
  86. </div></td></tr>
  87. <tr style='margin:0;padding:0;background:none'><td class='rej_td'>Kod z obrazka</td><td><input type='text' name='kod' class='logowanie_form' maxlength=5></td></tr>
  88. </table>
  89. <input type='hidden' value=$losuj_kod name='wylosowany'>
  90. <input type='submit' value='Załóż konto' class='logowanie_submit' name='submit'>";
  91. }
  92. ?>
Greg0
Ludzie ci pisza jak to zrobić poprawnie a ty dalej swoje i nie dasz sobie przemówić do rozsądku.
MUSISZ użyć mysql_num_rows dla warunku, bo mysql_query zwraca TRUE zawsze gdy zapytanie do bazy zostanie prawidłowo wykonane, bez względu na to czy zwróci jakieś dane czy nie. Jeśli zapytanie będzie jakkolwiek błędne (składnia), zwróci FALSE.
I ja też napiszę ostatni raz, prawidłowe rozwiązanie jest w poście 3. Koniec kropka.
Turson
  1. $wp = mysql_query("SELECT * FROM users WHERE login=$login OR mail=$mail");
  2. if(mysql_num_rows($wp))
  3. {
  4. echo 'Konto z takim loginem lub adresem e-mail już istnieje.';
  5. }
  6. else
  7. {
  8. mysql_query("INSERT INTO users VALUES (null, '$login', '$mail', '$password', 0, 0)") or die(mysql_error());
  9. $lh = $login . $password;
  10. $md5 = md5($lh);
  11. mysql_query("INSERT INTO kod_aktywacyjny VALUES ('$login', '$md5')") or die(mysql_error());
  12. echo "Konto zostało założone.";
  13. }


Cytat
Warning: mysql_num_rows() expects parameter 1 to be resource, boolean given in D:\Program Files (x86)\xampp\htdocs\ogl\include\rejestracja.php on line 29
Konto zostało założone.

Zakłada konto przy kombinacji istniejący login+istniejący mail
Greg0
Twoje zapytanie zwraca błąd. Zobacz jaki
  1. mysql_query("SELECT * FROM users WHERE login=$login OR mail=$mail") or die(mysql_error());
nospor
Tyle postow w tej parodii tematu ze mogliscie juz wkoncu uswiadomic kolege, ze wartosci tekstowe bierze sie w apostrofy....

$wp = mysql_query("SELECT * FROM users WHERE login='$login' OR mail='$mail'") or die(mysql_error());
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.