Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Logowanie
Forum PHP.pl > Forum > Przedszkole
jinchuriki
Zrobiłem sobie prosty skrypt logowania:
Kod
<?php
session_start();
if(isSet($_POST['zalogowany'])){
header("Location: jakiś tam link");
exit();
}

else if(isSet($_POST['nazwa']) && isSet($_POST['haslo'])){
if($_POST['nazwa'] == 'user1' && $_POST['haslo'] == 'pass1'){
$_SESSION['zalogowany'] = 'user1';
header("Location: jakiś tam link");
exit();
}
}
?>
<form method="POST" action="loguj.php">
Podaj nazwę i hasło<br />
Użytkownik:
<input type="text" name="nazwa"><br />
Hasło:
<input type="password" name="haslo"><br />
<input type="submit" value="Wejdź">
</form>


I teraz chcę to połączyć z JS, po wpisaniu poprawnego hasła i loginu, powinna rozsunąć się treść prawidłowa. JS nie znam, kod na rozwijanie znalazłem u was:
Kod
<script type="text/javascript">
function showHidden(obj){
obj = document.getElementById(obj);
obj.style.display == 'none' ? obj.style.display = '' : obj.style.display = 'none';
}
</script>

Kod
<table border="0">
<tr><td><a onclick="showHidden('hidden2');" href="javascript:void(0);">Click me!</a></td></tr>
<tr id="hidden2" style="display:none;"><td>treść</td></tr>
</table>


A teraz jak zrobić, żeby po wpisaniu danych rozwinęła się treść? smile.gif

I teraz druga sprawa: mianowicie dlaczego pola input od razu pokazują to co trzeba wpisać? blink.gif
v1t4n
Jezeli chcesz zabezpieczyc pewne dane przed widokiem to nie jest to wg mnie najlepszy sposob, ja proponowałbym uzycie ajaxa. W twoim przypadku mozna podejzec "ukryta tresc" wchodzac w zrodlo.

Co do zapamietywania hasel to prawdopodobnie przegladarka zapamietuje dane.
jinchuriki
Hmm, tylko że ja danych nie wpisywałem nawet.... Od razu wczytuje się tak jak ma być. A jak można inaczej niż Ajaxem to zrobić, bo ja w tym temacie ni hu hu...
v1t4n
Jezeli to ma byc po wpisaniu tak jak napisales, a nie po wcisnieciu submita to musisz monitorowac caly czas dane ktore wchodza w inputy (event onChange). Sposob fajny jesli masz 1 konto do logowania. W tym momencie wklepujesz sobie gdzies zapisane loginy i hasla (oczywiscie w md5) i w JS porównujesz czy pasuje z tym co masz.
Mozna jeszcze wysylac ajaxem zapytanie do bazy co kazda zmiane ale to jest nawal informacji i mozna przeciazyc serwer.

Proponuje ci zrobic to po nacisnieciu submita, ajaxem wyslac wtedy zapytanie do bazy i sciagnac tresc jesli jest taki user z takim loginem.
Pozniej innerHTML i wsadzasz sciagnieta tresc do diva/td.

Mialem podobny problem u siebie na localu - przegladarka zapamietala mi dla jednej strony login i haslo a na innej stronie je wklepywala. Pomogla mi zmiana nazw inputow w formie.
jinchuriki
Heh, to ma być tylko jedna nazwa usera i hasło tak jak podałem to wyżej, bo będzie do tego miała dostęp tylko osoba powołana. winksmiley.jpg
v1t4n
Na poczatku funkcja(e) w JS:
  1. function getById(item) return document.getElementById(item);
  2. function checkLogin(obj){
  3. if(md5(getById('name').value) == getById('hName').value && md5(getById('pass').value) == getById('hPass').value){
  4. getById(obj).style.display = '';
  5. } else getById(obj).style.display = 'none';
  6. }


Pozniej deczko przerobiony formularz:
  1. <form method="POST" action="loguj.php">
  2. Podaj nazwę i hasło<br />
  3. Użytkownik:
  4. <input type="text" name="nazwa" id="name" onChange="checkLogin('hidden2')"><input type="hidden" id="hName" value="%nazwa usera w md5%"><br />
  5. Hasło:
  6. <input type="password" name="haslo" id="pass" onChange="checkLogin('hidden2')"><input type="hidden" id="hPass" value="%haslo usera w md5%"><br />
  7. <input type="submit" value="Wejdź">
  8. </form>


Mam nadzieje ze sie nie walnalem bo pisalem na zywca. %nazwa usera w md5% i %haslo usera w md5% wklep sobie w php uzywajac md5()
jinchuriki
Możesz objaśnić jak to ma działać, bo nie wiem jaki ma być efekt...
v1t4n
1. Wstawiasz sobie tresc w tej tabeli ktora podales w pierwszym poscie.
2. W php wypluwasz haslo i nazwe usera zakodowane w md5 i zapisujesz w polach ukrytych hName i hPass.
3. Na pola ktore utworzyles nalozylem event onChange ktory odwoluje sie do funkcji checkLogin()
4. Funkcja checkLogin sprawdza czy md5 wpisanych hasel jest taki sam jak hasla ktore wyciagnales w pkt 2 - jesli tak to zmienia ustawia tr hidden2 na widoczny

Cala babranina w md5 jest potrzebna zeby uniknac kradzieży hasla. Powinien tez byc jakis interval zeby zblokowac boty.
jinchuriki
No to powiem, żen ie działa. sad.gif
v1t4n
Przepraszam, zapomnialem ze md5 nie ma standardowo w JS. Mozesz go sciagnac tutaj: http://pajhome.org.uk/crypt/md5/2.2/md5.js
Przy okazji zmienilem troszke tamten uklad (sprawdza co 50ms bo onChange sie dziwnie zachowuje). Musisz dodac onLoad="checkLogin()" do body.

JS:
  1. function getById(item){ return document.getElementById(item) };
  2. function checkLogin(){
  3. if(hex_md5(getById('name').value) == getById('hName').value && hex_md5(getById('pass').value) == getById('hPass').value){
  4. getById('hidden2').style.display = '';
  5. } else {
  6. getById('hidden2').style.display = 'none';
  7. setTimeout("checkLogin();", 50);
  8. }
  9. }


HTML:
  1. <form method="POST" action="loguj.php">
  2. Podaj nazwę i hasło<br />
  3. Użytkownik:
  4. <input type="text" name="nazwa" id="name">
  5. <input type="hidden" id="hName" value="%nazwa usera w md5%"><br />
  6. Hasło:
  7. <input type="password" name="haslo" id="pass">
  8. <input type="hidden" id="hPass" value="%haslo usera w md5%"><br />
  9. <input type="submit" value="Wejdź">
  10. </form>
  11. <div id="hidden2" style="display:none;">Lorem Ipsum</div>
  12. </body>
  13. </html>
jinchuriki
Na samym początku wyskakuje taki błąd, ale da się logować:
  1. Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at C:\Program Files\Apache Software Foundation\Apache2.2\htdocs\edytuj.php:133) in C:\Program Files\Apache Software Foundation\Apache2.2\htdocs\edytuj.php on line 395


Gdy się zaloguję wyskakuje następny błąd:
  1. Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at C:\Program Files\Apache Software Foundation\Apache2.2\htdocs\edytuj.php:133) in C:\Program Files\Apache Software Foundation\Apache2.2\htdocs\edytuj.php on line 395


Wiem, że to przez limiter, ale co teraz zrobić.
v1t4n
Prozaiczny blad: printujesz jakies dane przed wysłaniem sesji - session_start() musi znajdowac sie na poczatku, najlepiej w pierwszej linii smile.gif
jinchuriki
print używam dwa razy w treści, która ma się rozwinąć. Wcześniej nie...

Tutaj musi być gdzieś błąd:
  1. <?php session_start();
  2. if(isSet($_POST['zalogowany'])){
  3. header("Location: edytuj.php");
  4. exit();
  5. }
  6.  
  7. else if(isSet($_POST['nazwa']) && isSet($_POST['haslo'])){
  8. if($_POST['nazwa'] == 'user1' && $_POST['haslo'] == 'pass1'){
  9. $_SESSION['zalogowany'] = 'user1';
  10. header("Location: edytuj.php");
  11. exit();
  12. }
  13. }
  14. ?>



Pisze, że pierwszy błąd pojawia się w linijce, w której jest: session_start();, a drugi w linijce w której jest: exit();, może ktoś zna problem?
v1t4n
Masz jakies tagi html przed "<?php ... ?>"?
jinchuriki
Dzięki, były tagi html. Teraz nie pokazują się błędy, teraz po wpisaniu poprawnego loginu i hasła strona się restartuje i nic więcej. ;/
v1t4n
Daj caly kod, konkretnie i szczegółowo opisz problem. Teraz to ja sie mogę tylko domyślać.
jinchuriki
  1. <?php session_start();
  2. if(isSet($_POST['zalogowany'])){
  3. header("Location: edytuj.php");
  4. exit();
  5. }
  6.  
  7. else if(isSet($_POST['nazwa']) && isSet($_POST['haslo'])){
  8. if($_POST['nazwa'] == 'user' && $_POST['haslo'] == 'pass'){
  9. $_SESSION['zalogowany'] = 'user';
  10. header("Location: edytuj.php");
  11. exit();
  12. }
  13. }
  14. ?>
  15.  
  16.  
  17. </head>
  18. <script src="code.js" type="text/javascript"></script>
  19.  
  20. <body onLoad="checkLogin()">
  21.  
  22.  
  23.  
  24. <script type="text/javascript">
  25. function showHidden(obj){
  26. obj = document.getElementById(obj);
  27. obj.style.display == 'none' ? obj.style.display = '' : obj.style.display = 'none';
  28. }
  29.  
  30. <script type="text/javascript">
  31. function getById(item){ return document.getElementById(item) };
  32. function checkLogin(){
  33. if(hex_md5(getById('name').value) == getById('hName').value && hex_md5(getById('pass').value) == getById('hPass').value){
  34. getById('hidden2').style.display = '';
  35. } else {
  36. getById('hidden2').style.display = 'none';
  37. setTimeout("checkLogin();", 50);
  38. }
  39. }
  40. <form method="POST" action="edytuj.php">
  41. Podaj nazwę i hasło<br />
  42. Użytkownik:
  43. <input type="text" name="nazwa" id="name">
  44. <input type="hidden" id="hName" value="%nazwa usera w md5%"><br />
  45. Hasło:
  46. <input type="password" name="haslo" id="pass">
  47. <input type="hidden" id="hPass" value="%haslo usera w md5%"><br />
  48. <input type="submit" value="Wejdź">
  49. </form>
  50. <div id="hidden2" style="display:none;"><center>
  51. skrypt w php
  52. </center></div>
  53. </body>
  54. </html>
v1t4n
A czy ten plik to edytuj.php?
Gdzie masz pole w formularzu o nazwie zalogowany? To chyba powinno byc $_SESSION ktore deklarujesz 7 linijek niżej.
jinchuriki
To pole nie ma być w formularzu, to sprawdza czy user już wcześniej się zalogował. smile.gif
Tak, to jest plik edytuj.php.
v1t4n
Nie rozumiem tutaj twojej logiki. Po co headerem wywoływać plik w którym już jesteś? Daje ci to tylko taki efekt, że tracisz wszystkie $_POST'y ktore przyszły z formularza. Jesli nawet ktos zalogowany przyjdzie (chociaz bede sie upieral ze tam powinno być $_SESSION zamiast $_POST w 2 linii) to i tak jak wejdzie na tą strone to trafi w martwą pętlę. Jeśli nie jest jeszcze zalogowany sprawdzi mu login i haslo, nada sesyjnej zalogowany jego login i znowu przeladuje nie dostajac zadnych $_POST'ów. Jedyne co teraz możesz zrobić to wsadzić tam niżej kod w php wykonujący się po ifie na $_SESSION['zalogowany'].

Opisz konkretniej co chcesz osiągnąc, bo wydaje mi sie, że idziesz całkiem w złą stronę.
jinchuriki
Chodzi o to, że na początku sprawdzam czy user nie jest już zalogowany, jeśli tak to powinno się to wtedy rozwinąć, jeśli nie musi wpisać nazwę użytkownika i hasło. Na początku, rzeczywiście pomyliło mi się miało być $_session, to poprawię. Mam nadzieję, że zrozumiałeś co chcę osiągnąć. Jeżeli coś robię źle zwróć mi uwagę.

Jakoś to zrobiłem, tylko teraz co zrobić, żeby nie pokazywało się gotowe hasło i login? questionmark.gif

Poradziłem sobie już sam, dzięki za pomoc. winksmiley.jpg
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.