Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]Panel logowania - problem ze skryptem
Forum PHP.pl > Forum > Przedszkole
artkow00
Witam.

Przedstawiam mój skrypt logowania. Próbuję wydziergać coś takiego, żeby user i admin logowali się z tego samego formularza, ale mam w bazie 2 tabele `users` i `admin`. Moje założenie było następujące:

Jeśli wypełniony firmularz ---> znajdź usera w tabeli `users` gdzie pasują dane logowania ---> jeśli brak pasujących wyników ---> znajdź admina w tabeli `admin` gdzie pasują dane logowania.

Jak znajdzie usera to ---> header do user_panel.php
Jak znajdzie admina to ---> header do admin_panel.php

Oto kod:
  1. [codebox] if(isset($_POST['name'])) {
  2. $_POST['name'] = clear($_POST['name']);
  3. $_POST['password'] = clear($_POST['password']);
  4. $_POST['password'] = codepass($_POST['password']);
  5. $result = mysql_query("SELECT `id` FROM `users` WHERE `name` = '{$_POST['name']}' AND `password` = '{$_POST['password']}' LIMIT 1");
  6. if(mysql_num_rows($result) > 0) {
  7. $row = mysql_fetch_assoc($result);
  8. $_SESSION['logged1'] = true;
  9. $_SESSION['id1'] = $row['id'];
  10. header ('Location: user/user_panel.php');
  11. }else {
  12. $result1 = mysql_query("SELECT `id` FROM `admin` WHERE `admin_name` = '{$_POST['name']}' AND `admin_pass` = '{$_POST['password']}' LIMIT 1");
  13. if(mysql_num_rows($result1) > 0) {
  14. $row1 = mysql_fetch_assoc($result1);
  15. $_SESSION['logged2'] = true;
  16. $_SESSION['id2'] = $row1['id'];
  17. header ('Location: admin_panel.php');
  18. }
  19. }
  20. }[/codebox]


Co jest nie tak? Usera loguje mi pięknie, ale już po wpisaniu poprawnych danych logowania admina nie dzieje się nic...
kosmos
Jaki jest sens trzymania danymch administratora w osobnej tabeli? Bedzie ich więcej niż 1? Chcesz aby za każdym razem kiedy użytkownik nie zostanie znaleziony w tabeli user, był nastepnie wyszukiwany w tabeli admin ? smile.gif
artkow00
Owszem, będzie więcej niż 1.
Pomijam fakt, że w późniejszej fazie będę chciał doklepać do tego jeszcze 3 rodzaj użytkownika - sprzedawca...
Ale to już inna bajka, chodzi mi o samą ideę jak poradzić sobie z takim zagadnieniem.

Sens jest następujący:

Admin potrzebuje tylko pól name, password, email.
User potrzebuje pól name, password, email, firma, nip, regon, imie, nazwisko... itd

Jak bym chciał to w 1 tabelę dać to admin też musiałby te wszystkie pola posiadać. Oczywiście mogłyby być NULL, ale chce, żeby pola dla usera byłu NOT NULL.
Qss
kod wygląda na poprawny, wina musi leżeć po innej stronie może zła lokalizacja w header może inaczej zapisałeś hasło dla admina niż dla usera

Proponuje usunąć chwilowo header w części admina próbować to debugować linia po lini zaraz po }else{
nospor
Cytat
ale już po wpisaniu poprawnych danych logowania admina nie dzieje się nic...
Skoro ci nie znajduje admina, to masz do wyboru:
1) Albo zle podales dane admina
2) Albo masz blad zapytania. Sprawdz, wyswietl ten blad, w ogole wyswietlaj wszystkie bledy.... Tu masz wszystko opisane jak masz tak banalne rzeczy rozwiazywac samemu:
Temat: Jak poprawnie zada pytanie
kosmos
wyprintuj sobie na początek dowolny wyraz po ELSE, póxniej sprawdź poprawnośc zapytania do bazy

  1. $result1 = mysql_query("SELECT `id` FROM `admin` WHERE `admin_name` = '{$_POST['name']}' AND `admin_pass` = '{$_POST['password']}' LIMIT 1") or die ('błąd zapytania do BD');
artkow00
Kosmos wyprintowałem, i nic. Nie printuje, więc problem musi się znajdować gdzieś przed else. name i password z formularza na bank jest ok - jak usunę zupełnie część z adminem to ładnie loguje usera i header również działa.

Po sprawdzeniu zapytania nie loguje admina, ani nie wyświetla 'błąd zapytania do BD'...
Po prostu pozostaje wyświetlony formularz z wpisanymi danymi i nic się nie dzieje.

Dobra wyświetla mi 'błąd' jeśli po else dam po prostu echo 'błąd'; ale sprawdzenie zapytania nie daje błędu bo dane logowania się zgadzają, nazwy, pola w bazie i inne detale równeiż są poprawnie (sprawdzone 10 razy) smile.gif
kosmos
Sprawdź co zwraca Ci



w przypadku gdy podajesz do logowania dane admina
artkow00
Dałem taki kodzik po else:

CODE

$result1 = mysql_query("SELECT `id` FROM `admin` WHERE `admin_name` = '{$_POST['name']}' AND `admin_pass` = '{$_POST['password']}' LIMIT 1") or die ('błąd zapytania do BD');
if(mysql_num_rows($result1) > 0){
echo 'askaskjcn';
}


Nie wyświetliło nic.
A oto screen z tabeli admina:



Po sprawdzeniu zmiennej $result1:

  1. [codebox]$result1 = mysql_query("SELECT `id` FROM `admin` WHERE `admin_name` = '{$_POST['name']}' AND `admin_pass` = '{$_POST['password']}' LIMIT 1") or die ('błąd zapytania do BD');
  2. echo 'cscs';
  3. var_dump($result1);[/codebox]


Otrzymuję:

resource(5) of type (mysql result)

Szczerze - nie mam pojęcia co to oznacza...
kosmos
  1. if(isset($_POST['name'])) {
  2. $_POST['name'] = clear($_POST['name']);
  3. $_POST['password'] = clear($_POST['password']);
  4. $_POST['password'] = codepass($_POST['password']);
  5. $result = mysql_query("SELECT `id` FROM `users` WHERE `name` = '{$_POST['name']}' AND `password` = '{$_POST['password']}' LIMIT 1");
  6. if(mysql_num_rows($result) > 0) {
  7. $row = mysql_fetch_assoc($result);
  8. $_SESSION['logged1'] = true;
  9. $_SESSION['id1'] = $row['id'];
  10. header ('Location: user/user_panel.php');
  11. }
  12. else {
  13. $result1 = mysql_query("SELECT `id` FROM `admin` WHERE `admin_name` = '{$_POST['name']}' AND `admin_pass` = '{$_POST['password']}' LIMIT 1");
  14. print_r($result1); // co zwraca?
  15. if(mysql_num_rows($result1) > 0) {
  16. $row1 = mysql_fetch_assoc($result1);
  17. $_SESSION['logged2'] = true;
  18. $_SESSION['id2'] = $row1['id'];
  19. header ('Location: admin_panel.php');
  20. }
  21. }
artkow00
Resource id #5
phpion
Cytat(artkow00 @ 5.11.2013, 13:49:53 ) *
Pomijam fakt, że w późniejszej fazie będę chciał doklepać do tego jeszcze 3 rodzaj użytkownika - sprzedawca...

Czyli dodasz kolejną tabelę do przeszukiwania? Co jeśli w każdej tabeli pojawi się użytkownik o tym samym loginie?

Cytat(artkow00 @ 5.11.2013, 13:49:53 ) *
Sens jest następujący:

Admin potrzebuje tylko pól name, password, email.
User potrzebuje pól name, password, email, firma, nip, regon, imie, nazwisko... itd

Jak bym chciał to w 1 tabelę dać to admin też musiałby te wszystkie pola posiadać. Oczywiście mogłyby być NULL, ale chce, żeby pola dla usera byłu NOT NULL.

Robisz tabelę główną użytkowników z podstatowymi informacjami oraz tabele profilów, np.:
user [id, username, password, type] gdzie type to typ użytkownika (np. 1 -> admin, 2 -> użytkownik)
user_profile_1 [user_id, ...] gdzie ... to pola charakterystyczne dla admina
user_profile_2 [user_id, ...] gdzie ... to pola charakterystyczne dla użytkownika
Będzie tutaj problem z zaciągnięciem informacji o profilu użytkownika, ale można to rozwiązać LEFT JOINując obie tabele user_profile_*. Otrzymujesz za to sporą elastyczność: wspólna tabela danych logowania, możliwość tworzenia dowolnej ilości typów użytkowników z dowolną ilością pól. Ewentualnie na swojej strukturze możesz do logowania wykorzystać widok na bazie danych, który będzie zawierał dane użytkowników z obu tabel.

// Edit:
W kodzie ~kosmosa zamień nic nie mówiące:
  1. print_r($result1); // co zwraca?

na:
  1. var_dump(mysql_num_rows($result1)); // co zwraca?
artkow00
Cytat(phpion @ 5.11.2013, 15:23:26 ) *
Czyli dodasz kolejną tabelę do przeszukiwania? Co jeśli w każdej tabeli pojawi się użytkownik o tym samym loginie?


Nie pojawi się - zadbałem o to.

Sprawdzenie zwróciło: int(0)

W ostateczności stworzę jedną tabelę z danymi wszystkich, ale to nie zmienia faktu, że do celów choćby edukacyjnych, chciałbym poznać rozwiązanie swojej "zagadki", zwłaszcza, że (jak wielu z was zauważyło) kod napisany jest poprawnie - a nie działa. tongue.gif
phpion
Cytat(artkow00 @ 5.11.2013, 15:50:33 ) *
Nie pojawi się - zadbałem o to.

Zadbałeś o to zapewne po stronie aplikacji, ale zmieniając dane np. przez phpMyAdmina możesz doprowadzić do takiej sytuacji. Wolałbym by baza sama z siebie zapewniła mi unikalność nazw użytkowników.

Cytat(artkow00 @ 5.11.2013, 15:50:33 ) *
Sprawdzenie zwróciło: int(0)

Czyli nie ma rekordów spełniających zadane kryteria, czyli nie ma takiego admina w bazie danych.
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.