Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]Sprawdzanie czy rekord jest już w bazie
Forum PHP.pl > Forum > Przedszkole
StadiPL
Witam po raz kolejny ;]
Postanowiłem dodać sobie możliwość sprawdzenia czy użykownik jaki chce się zarejestrować nie istnieje już w bazie oraz czy jego email nie został już użyty.
  1. //Oczywiście łączę się z bazą danych ;p
  2. $nickname_q = mysql_query("SELECT * FROM users WHERE nickname = '$nickname'") or die(mysql_error());
  3. $nickname_check = mysql_num_rows($nickname_q);
  4. $email_q = mysql_query("SELECT * FROM users WHERE email= '$email'") or die(mysql_error());
  5. $email_check = mysql_num_rows($email_q);
  6.  
  7. //Nieistotna część kodu
  8. else if ($nickname_check=1) {echo $existing_nickname;}
  9. else if ($email_check=1) {echo $extisting_email;}
  10. {
  11. echo 'Wykonanie skryptu ';
  12.  
  13. //na razie wartość id zmieniam ręcznie, ale dodam wkrótce dodam żeby automatycznie sczytywał największą wartość i dodawał o 1 wyższą
  14. $id="1";
  15.  
  16. $ins = @mysql_query("INSERT INTO users SET id='$id', nickname='$nickname', password='$password', email='$email' ");
  17. if ($ins) echo "OK"; else echo "LIPA";

Czemu nie działa poprawnie?
Sobak
  1. $nickname_check=1

= to operator przypisania. Ty chcesz porównać wartości - czyli użyj ==. Już nie wgłębiając się w szczegóły, w tym wypadku użycie = zwróci Ci zawsze true więc efekt jest niezgodny z oczekiwanym.

Jeśli chodzi o samo sprawdzenie czy rekord się powtarza, to pamiętaj, że w SQL masz funkcję COUNT() a najlepiej po prostu nadać polu UNIQUE smile.gif

Cytat
na razie wartość id zmieniam ręcznie, ale dodam wkrótce dodam żeby automatycznie sczytywał największą wartość i dodawał o 1 wyższą

AUTO_INCREMENT na pole z ID w bazie jest tym czego szukasz.
StadiPL
No więc teraz ta część mojego kodu wygląda tak:
  1. $nickname_check=count($nickname);
  2. $email_check=count($email);
  3.  
  4. //Sprawdzenie warunków czy można dokonać rejestracji
  5. if(empty($nickname)){$no_nickname;}
  6. else if(empty($password) || empty($password_r)){echo $no_password;}
  7. else if($password != $password_r){echo $different_password;}
  8. else if(empty($email) || empty($email_r)){echo $no_email;}
  9. else if($email != $email_r){echo $different_email;}
  10. else if(strlen($nickname) < 3 || !preg_match('/^[A-Za-z0-9]+$/', $nickname)) {echo $bad_nickname;}
  11. else if(strlen($password) < 3 || !preg_match('/^[A-Za-z0-9]+$/', $password)) {echo $bad_password;}
  12. else if(!filter_var($email,FILTER_VALIDATE_EMAIL)){echo $bad_email;}
  13. else if($nickname_check==1) {echo $existing_nickname;}
  14. else if($email_check==1) {echo $extisting_email;}
  15. else {
  16. echo 'Wykonanie skryptu ';
  17.  
  18. $ins = @mysql_query("INSERT INTO users SET nickname='$nickname', password='$password', email='$email' ");
  19. if ($ins) echo "OK"; else echo "LIPA";
  20.  
  21. mysql_close($connection);
  22. }

I zawsze zwróci mi wartość $existing_nickname przeglądałem milion razy i nigdzie nie widze błędu. ktos mnie oswieci? ;]
session
  1. ("SELECT COUNT(*) FROM `users` WHERE `nickname` = '".$nickname."'")

Spróbuj tak i już potem nie licz żadnym count(), ani mysql_num_rows(), takie zapytanie samo zwróci Ci ilość.
  1. $nickname_check=mysql_fetch_row($nickname_q);
  2. if($nickname_check[0]!=0){echo $existing_nickname;}


-- EDIT --
@Sobak przeoczyłem, że pisałeś o COUNT()
StadiPL
Próbowałem już tym sposobem. Problem musi leżeć w tej części kodu:
  1. if($nickname_check==1) {echo $existing_nickname;}
  2. else if($email_check==1) {echo $extisting_email;}
  3. else {
  4. ...
  5. }
session
Tak problem jest w tym, że funkcją count() zliczasz ilość elementów tablicy, gdzie zawsze jest conajmniej 1, a nie wartość tych elementów. Spróbuj tak jak pisałem.
StadiPL
Parse error: syntax error, unexpected 'SELECT' (T_STRING) in D:\_XAMPP\serwer\htdocs\log\register_function.php on line 30
  1. $q1 = "("SELECT COUNT(*) FROM `users` WHERE `nickname` = '".$nickname."'")";
  2. $r1 = mysql_query($q1);
  3. $q2 = "("SELECT COUNT(*) FROM `users` WHERE `email` = '".$email."'")";
  4. $r2 = mysql_query($q2);
  5.  
  6. //Sprawdzenie warunków czy można dokonać rejestracji
  7. if(empty($nickname)) {echo $no_nickname;}
  8. else if(empty($password) || empty($password_r)){echo $no_password;}
  9. else if($password != $password_r){echo $different_password;}
  10. else if(empty($email) || empty($email_r)){echo $no_email;}
  11. else if($email != $email_r){echo $different_email;}
  12. else if(strlen($nickname) < 3 || !preg_match('/^[A-Za-z0-9]+$/', $nickname)) {echo $bad_nickname;}
  13. else if(strlen($password) < 3 || !preg_match('/^[A-Za-z0-9]+$/', $password)) {echo $bad_password;}
  14. else if(!filter_var($email,FILTER_VALIDATE_EMAIL)){echo $bad_email;}
  15. else if($r1==1) {echo $existing_nickname;}
  16. else if($r2==1) {echo $existing_email;}
  17. else
session
  1. $nickname_q = mysql_query("SELECT COUNT(*) FROM `users` WHERE `nickname` = '".$nickname."'") or die(mysql_error());
  2. $nickname_check = mysql_fetch_row($nickname_q);
  3. $email_q = mysql_query("SELECT COUNT(*) FROM `users` WHERE `email`= '".$email."'") or die(mysql_error());
  4. $email_check = mysql_fetch_row($email_q);
  5.  
  6. //Nieistotna część kodu
  7. else if ($nickname_check[0]!=0) {echo $existing_nickname;}
  8. else if ($email_check[0]!=0) {echo $extisting_email;}
  9. {
  10. echo 'Wykonanie skryptu ';
  11.  
  12. //na razie wartość id zmieniam ręcznie, ale dodam wkrótce dodam żeby automatycznie sczytywał największą wartość i dodawał o 1 wyższą
  13. $id="1";
  14.  
  15. $ins = @mysql_query("INSERT INTO users SET id='$id', nickname='$nickname', password='$password', email='$email' ");
  16. if ($ins) echo "OK"; else echo "LIPA";


INSERT i tak Ci nie zadziała prawidłowo, ponieważ podajesz błędne id, musisz ustawić w MySQL pole id na auto_increment a w zapytaniu INSERT przypisać do id wartość NULL: id=NULL.
StadiPL
Może zapodam po prostu najnowszą wersję całości, bo przykładowo ten problem już rozwiązałem (ktoś na forum mi podpowiedział):
  1. <?php
  2. //zamiana zmiennych POST na zwykłe zmienne
  3. $nickname=$_POST['nickname'];
  4. $password=$_POST['password'];
  5. $password_r=$_POST['password_r'];
  6. $email=$_POST['email'];
  7. $email_r=$_POST['email_r'];
  8.  
  9. //Wyświetlane teksty
  10. $no_nickname="Podanie nazwy uzytkownika jest wymagane";
  11. $no_password="Podanie hasla i jego powtorzenie jest wymagane";
  12. $different_password="Podane hasla roznia sie'";
  13. $no_email="Podanie e-maila i jego powtorzenie jest wymagane";
  14. $different_email="Podane e-maile roznia sie";
  15. $bad_nickname="Niedozwolona nazwa uzytkownika";
  16. $bad_password="Niedozwolone haslo";
  17. $bad_email="Nieprawidłowy adres email";
  18. $existing_nickname="Istnieje już użytkownik '$nickname' w bazie. Wybierz inna nazwę uzytkownika!";
  19. $existing_email="Adres email '$email' już istnieje w bazie";
  20.  
  21. //Dodać łączenie się z bazą danych. Najlepiej z osobnego zabezpieczonego pliku
  22. $connection = @mysql_connect('127.0.0.1', 'root', '')
  23. or die('Brak połączenia z serwerem MySQL.<br />Błąd: '.mysql_error());
  24. $db = @mysql_select_db('jink', $connection)
  25. or die('Nie mogę połączyć się z bazą danych<br />Błąd: '.mysql_error());
  26.  
  27. //Zapytania o występowanie podanych danych oraz zapisanie wyniku tej operacji w postaci 0 lub 1
  28. /*$nickname_check=count($nickname);
  29. $email_check=count($email);*/
  30. $q1 = '("SELECT COUNT(*) FROM `users` WHERE `nickname` = '".$nickname."'")';
  31. $r1 = mysql_query($q1);
  32. $q2 = '("SELECT COUNT(*) FROM `users` WHERE `email` = '".$email."'")';
  33. $r2 = mysql_query($q2);
  34.  
  35. //Sprawdzenie warunków czy można dokonać rejestracji
  36. if(empty($nickname)) {echo $no_nickname;}
  37. else if(empty($password) || empty($password_r)){echo $no_password;}
  38. else if($password != $password_r){echo $different_password;}
  39. else if(empty($email) || empty($email_r)){echo $no_email;}
  40. else if($email != $email_r){echo $different_email;}
  41. else if(strlen($nickname) < 3 || !preg_match('/^[A-Za-z0-9]+$/', $nickname)) {echo $bad_nickname;}
  42. else if(strlen($password) < 3 || !preg_match('/^[A-Za-z0-9]+$/', $password)) {echo $bad_password;}
  43. else if(!filter_var($email,FILTER_VALIDATE_EMAIL)){echo $bad_email;}
  44. else if($r1==1) {echo $existing_nickname;}
  45. else if($r2==1) {echo $existing_email;}
  46. else
  47.  
  48.  
  49. /*if($nickname_check==1) {echo $existing_nickname;}
  50. else if($email_check==1) {echo $extisting_email;}
  51. else*/ {
  52. echo 'Zarejestrowano ';
  53.  
  54. //Generowanie tokenu
  55. $token_znaki = '1234567890qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM';
  56. $token = '';
  57. for ($i=0; $i<18; $i++) { $token .= $token_znaki[rand()%(strlen($token_znaki))]; } // 18 to długość ciągu
  58.  
  59. $ins = @mysql_query("INSERT INTO users SET nickname='$nickname', password='$password', email='$email', token='$token' ");
  60. if ($ins) echo "pomyślnie"; else echo "niepomyślnie";
  61.  
  62. mysql_close($connection);
  63. }
  64. ?>
session
Dlaczego nie zmienisz na to jak Ci napisałem ? tongue.gif Twój kod nie ma prawa działać prawidłowo. Jest w nim dużo błędów zaczynając od nieprawidłowego używania ' , brak odczytu wyniku zapytania, problem z wyświetlaniem błędów użytkownikom (pisałem o tym w innym Twoim temacie smile.gif )
StadiPL
To nie zmieniłem na to co mi napisałeś? ;D Jak to źle używam ' ? Użytkownikom wszystkie błędy wyświetla dobrze.. nie licząc tego nie działającego sprawdzania czy nick i email juz występuje, z którym się już nieźle męczę na wszystkie sposoby.
session
Zamień:
  1. $q1 = '("SELECT COUNT(*) FROM `users` WHERE `nickname` = '".$nickname."'")';
  2. $r1 = mysql_query($q1);
  3. $q2 = '("SELECT COUNT(*) FROM `users` WHERE `email` = '".$email."'")';
  4. $r2 = mysql_query($q2);

Na:
  1. $nickname_q = mysql_query("SELECT COUNT(*) FROM `users` WHERE `nickname` = '".$nickname."'") or die(mysql_error());
  2. $nickname_check = mysql_fetch_row($nickname_q);
  3. $email_q = mysql_query("SELECT COUNT(*) FROM `users` WHERE `email`= '".$email."'") or die(mysql_error());
  4. $email_check = mysql_fetch_row($email_q);

Oraz:
  1. else if($r1==1) {echo $existing_nickname;}
  2. else if($r2==1) {echo $existing_email;}

Na:
  1. else if ($nickname_check[0]!=0) {echo $existing_nickname;}
  2. else if ($email_check[0]!=0) {echo $extisting_email;}

Niepoprawnie używasz właśnie w tym co Ci nie działa wink.gif Praktycznie w trakcie zamykasz ' a potem ciąg dalszy którego nie łączysz
StadiPL
A więc pozmieniałem tak jak mówisz.. Gdy podaje dane nieistniejącego użytkownika to działa. Gdy podaje dane z istniejącym loginem to prawidłowo wyskakuje błąd. Natomiast gdy podam dane z użytym już adresem email, to jest coś takiego: Istnieje już użytkownik 'kupa' w bazie. Wybierz inna nazwę uzytkownika!
On powinien to wyświetlić gdy uzytkownik juz istnieje. w przypadku emaila jest zmienna $extisting_email
EDIT: czyli w sumie wracam do punktu wyjscia ;d
session
No nie bardzo jest to możliwe, albo istnieje już kupa i działa dobrze ten błąd, albo pozamieniałeś zmienne z błędami. Albo masz coś źle w formularzu, np. dwa razy nickname, innej możliwości nie widzę. Posprawdzaj dobrze wink.gif
StadiPL
YEEEAHH! ;] To byla zwykla !@#!@#!@# literówka! A sie na nia wnerwilem ;]
session
"$extisting_email" ? tongue.gif
StadiPL
A tak jeszcze wracając na chwilkę, to lepsze będzie te Twoje rozwiązanie czy count? ;]
session
W jakim znaczeniu lepsze ? COUNT(*) jako komenda MySQL zwraca liczbę wyników, a funkcja count() z PHP liczy ilość elementów w tablicy, czyli coś co kompletnie tutaj Cie nie interesuje. Tylko i wyłącznie COUNT(*) w zapytaniu MySQL.
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.