Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php][mysql]skrypt logowania-kilka pytań
Forum PHP.pl > Forum > Przedszkole
predator
Przerobiłem troche znaleziony w internecie kod i wygląda on następująco:

index.php
  1. <?php
  2.  
  3. $login = $_POST["login"];
  4. $haslo = $_POST["haslo"];
  5.  
  6.  
  7. if(empty($_SESSION["zalogowany"]))$_SESSION["zalogowany"]=0;
  8.  
  9. mysql_connect("", "", "")or die("Nie można nawiązać połączenia z bazą");
  10. mysql_select_db("")or die("Wystąpił błąd podczas wybierania bazy danych");
  11.  
  12. function ShowLogin($komunikat=""){
  13. echo "$komunikat<br>";
  14. echo "<form action='index.php' method=post>";
  15. echo "Login: <input type=text name=login><br>";
  16. echo "Hasło: <input type=text name=haslo><br>";
  17. echo "<input type=submit value='Zaloguj!'>";
  18. echo "</form>";
  19. echo "Jeśli nie jesteś zarejestrowany, <a href='rejestruj.php'>tu znajdziesz formularz</a>";
  20. }
  21.  
  22. ?>
  23. <!DOCTYPE html 
  24. PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN">
  25.  <html>
  26. <head>
  27. <title>logowanie</title>
  28. </head>
  29. <body>
  30. <?php
  31. if($_GET["wyloguj"]=="tak"){$_SESSION["zalogowany"]=0;echo "Zostałeś wylogowany";}
  32. if($_SESSION["zalogowany"]!=1){
  33. if(!empty($login) && !empty($haslo)){
  34. {
  35. if(preg_match('#^[A-Za-z0-9_-]+$#', $login)){
  36.  
  37.  
  38. if(mysql_num_rows(mysql_query("select * from users where user_login = '".htmlspecialchars($login)."' AND user_haslo = '".htmlspecialchars(md5($haslo))."'"))){
  39. echo "Zalogowano poprawnie. <a href='index.php'>Przejdź na stronę główną</a>";
  40. $_SESSION["zalogowany"]=1;
  41. $_SESSION['nick'] = htmlspecialchars($login);
  42. } 
  43. else echo ShowLogin("zle haslo!!!");
  44.  
  45. }
  46. else echo ShowLogin("nie dozwolone znaki");
  47. }
  48.  
  49. }
  50. else ShowLogin();
  51. }
  52. else{
  53. ?>
  54. Zalogowałeś się pomyślnie!
  55. <br><a href='index.php?wyloguj=tak'>wyloguj się</a>
  56. <?php
  57. }
  58. ?>
  59.  
  60. </body>
  61.  </html>
  62. <?php mysql_close(); ?>


rejestruj.php
  1. <?php
  2. mysql_connect("", "", "")or die("Nie można nawiązać połączenia z bazą"); //połączenie z bazą danych
  3. mysql_select_db("")or die("Wystąpił błąd podczas wybierania bazy danych");
  4.  
  5. $login = $_POST["login"];
  6. $haslo = $_POST["haslo"];
  7.  
  8. function ShowForm($komunikat=""){ //funkcja wyświetlająca formularz rejestracyjny
  9. echo "$komunikat<br>";
  10. echo "<form action='rejestruj.php' method=post>";
  11. echo "Login: <input type=text name=login><br>";
  12. echo "Hasło: <input type=text name=haslo><br>";
  13. echo "<input type=hidden value='1' name=send>";
  14. echo "<input type=submit value='Zarejestruj'>";
  15. echo "</form>";
  16. }
  17. ?>
  18. <!DOCTYPE html 
  19. PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN">
  20.  <html>
  21. <head>
  22. <title>Formularz rejestracyjny</title>
  23. </head>
  24. <body>
  25. <?php
  26. if($_POST["send"]==1){ //sprawdzanie czy formularz został wysłany
  27. if(!empty($login) && !empty($haslo)) //oraz czy uzupełniono wszystkie dane
  28.  
  29. {
  30. if(preg_match('#^[A-Za-z0-9_-]+$#', $login)){ //sprawdzenie poprawnosci znaków
  31.  
  32. if(mysql_num_rows(mysql_query("select * from users where user_login='".htmlspecialchars($login."'"))))ShowForm("Użytkownik o podanym loginie już istnieje!!!");// sprawdzanie czy użytkownik o podanej nazwie już istnieje
  33. else 
  34. {
  35. mysql_query("insert into users values(NULL, '".htmlspecialchars($login)."', '".htmlspecialchars(md5($haslo))."')"); // zapisywanie rekordu do bazy
  36. echo "Rejestracja przebiegła pomyślnie. Możesz teraz przejść do <a href='index.php'>strony głównej</a> i się zalogować.";
  37. }
  38. }
  39. else ShowForm("nie dozwolone znaki");
  40. }
  41.  
  42. else ShowForm("Nie uzupełniono wszystkich pól!!!");
  43. }
  44. else ShowForm();
  45. mysql_close(); //zamykanie połączenia z bazą
  46. ?>
  47. </body>
  48. </html>


1. czy jest ten skrypt bezpieczny? jeśli nie to jakie zmiany proponujecie
2. jak zabezpieczyć najlepiej w md5() hasło do bazy danych?
  1. <?php
  2. mysql_connect("", "", "")or die("Nie można nawiązać połączenia z bazą");
  3. mysql_select_db("")or die("Wystąpił błąd podczas wybierania bazy danych");
  4. ?>

3. użyłem funkcji preg_match do zabezpieczenia formularza ale działa on tylko dla jednej zmiennej $login lub $haslo:
  1. <?php
  2. if(preg_match('#^[A-Za-z0-9_-]+$#', $login))
  3. ?>

gdy próbuje napisać tak(by obydwa pola formularza zabezpieczyć, bo co mi da że pole loginu zabezpiecze tylko jeśli w polu hasła można wpisać co sie chce..):
  1. <?php
  2. if(preg_match('#^[A-Za-z0-9_-]+$#', $login, $haslo))
  3. ?>

to pojawia sie błąd.

jak tego użyć by zabezpieczyć obydwa pola?

PS nie mam pojęcia dlaczego nie koloruje składni :/ być może kod html to powoduje ale nie wiem...
erix
  1. Zamiast htmlentities" title="Zobacz w manualu PHP" target="_manual w zapytaniu lepiej użyj mysql_escape_string" title="Zobacz w manualu PHP" target="_manual.
  2. Musisz gdzieś podać hasło "surowe", inaczej się nie połączy. Wyłącz raportowanie błędów, postaraj się uniemożliwić dostęp do podglądu źródła skryptu.
  3. Poczytaj o preg_match" title="Zobacz w manualu PHP" target="_manual.
predator
Cytat
Poczytaj o preg_match

Szukałem długo jak zrobić, kombinowałem ale nic... I dlatego tu napisałem.

Cytat
Musisz gdzieś podać hasło "surowe", inaczej się nie połączy. Wyłącz raportowanie błędów, postaraj się uniemożliwić dostęp do podglądu źródła skryptu.


Użyje require() ale gdzie dać ten plik includowany jeśli adres strony z logowaniem to www.jakas_strona.pl/index.php ?

Katalog tego pliku powinien być wyżej niż index.php ale wyżej sie nie da chyba.

Cytat
Zamiast htmlentities w zapytaniu lepiej użyj mysql_escape_string.

Dlaczego uważasz że takie rozwiązanie lepsze?

PS Wstawiam na początku error_reporting(0); by nie wyświetlało błędów i nie ma reakcji na tę funkcję, errory dalej sie pojawiają.
Wstawiałem na początku przed session_start(), wstawiałem też przed tą linią:
  1. <?php
  2. if($_GET["wyloguj"]=="tak"){$_SESSION["zalogowany"]=0;echo "Zostałeś wylogowany";}
  3. ?>


i nie działa
erix
Cytat
Szukałem długo jak zrobić, kombinowałem ale nic... I dlatego tu napisałem.

preg_match" title="Zobacz w manualu PHP" target="_manual za jednym razem może sprawdzać tylko jedną zmienną. Musisz dodać kolejne ify dla kolejnych pól.

Cytat
Katalog tego pliku powinien być wyżej niż index.php ale wyżej sie nie da chyba.

Da się, jeśli masz po zalogowaniu do ftp masz katalog public_html. Tylko najlepiej posługuj się ścieżkami bezwzględnymi.

Cytat
Dlaczego uważasz że takie rozwiązanie lepsze?

Poczytaj o SQL Injection.

Cytat
errory dalej sie pojawiają.

Tzn, jakie?

Cytat
PS nie mam pojęcia dlaczego nie koloruje składni :/ być może kod html to powoduje ale nie wiem...

Zamiast tagu [ code] używaj [ php]
predator
Cytat
Da się, jeśli masz po zalogowaniu do ftp masz katalog public_html. Tylko najlepiej posługuj się ścieżkami bezwzględnymi.


Nie mam takiego katalogu sadsmiley02.gif . Jak inaczej zabezpieczyć?

Cytat
Poczytaj o SQL Injection.

Ale po zabezpieczeniu formularza (tak że po wprowadzeniu czego innego niż litery i cyfry zamiast przystępować do logowania pokazuje sie informacja) nie da sie chyba zastosowac SQL Injection.
Bo najpierw jest sprawdzana poprawnosc:
Kod
if(preg_match('#^[A-Za-z0-9_-]+$#', $login))



Cytat
Cytat
errory dalej sie pojawiają.

Tzn, jakie?

Np. specjalnie wpisuje więcej znaków } i pojawia sie błąd:
Kod
Parse error:  syntax error, unexpected '}'

a nie powinien przecież po zastosowaniu error_reporting(0);

Może źle coś robie?
erix
Cytat
Nie mam takiego katalogu . Jak inaczej zabezpieczyć?

Jeśli masz dostęp do .htaccess, to za pomocą tego pliku możesz zabezpieczyć.

Cytat
Ale po zabezpieczeniu formularza (tak że po wprowadzeniu czego innego niż litery i cyfry zamiast przystępować do logowania pokazuje sie informacja) nie da sie chyba zastosowac SQL Injection.

Ach, faktycznie, moje niedopatrzenie. Ale strzeżonego Pan Bóg strzeże... Poza tym, nie masz możliwości wprowadzania innych znaków niż podstawowe ASCII (i to mniej). Więc np. polskie krzaczki odpadają chyba, że to celowe.

Cytat
Parse error: syntax error, unexpected '}'

Hmm, szczerze mówiąc, nie mam pomysłu, dlaczego tak się dzieje pomimo, że jest ustawione na zero... A innego rodzaju błędy są wypisywane? (np. notice, warning, itp)
predator
Cytat
A innego rodzaju błędy są wypisywane? (np. notice, warning, itp)

Nie wiem jak takie błędy wywołać ale skoro tamten błąd sie pojawił to inne też zapewne sie pojawią.

Tak sie zastanawiam i przecież te polecenia z formularza są najpierw wysyłane do serwera i on je analizuje. Więc w bazie danych nic nikt nie namiesza ale na serwerze chyba może. Trzeba by było po stronie użytkownika sprawdzić najpierw chyba np poprzez java script dry.gif

Cytat
Jeśli masz dostęp do .htaccess, to za pomocą tego pliku możesz zabezpieczyć.

nie mam :/

Ale pliku php nie można podejrzeć podobno, tylko jakimiś zapytaniami lub jakoś inaczej. Są też programy do ściągania stron ale one tylko w html'u ściągają? albo sie myle?

Jakich błędów sie wystrzegać by nikt np w swoim skrypcie includując mój index.php nie podejrzał zakładając ze w tym index.php jest hasło?

P.S.
Zastosowałem mysql_escape_string razem z htmlspecialchars. Czy może to tak być?
  1. <?php
  2. if(mysql_num_rows(mysql_query("select * from users where user_login = '".mysql_escape_string(htmlspecialchars($login))."' AND user_haslo = '".mysql_escape_string(htmlspecialchars(md5($haslo)))."'"))){
  3. echo "Zalogowano poprawnie. <a href='index.php'>Przejdź na stronę główną</a>";
  4. $_SESSION["zalogowany"]=1;
  5. $_SESSION['nick'] = mysql_escape_string(htmlspecialchars($login));
  6. }
  7. ?>


ma ktoś jakiś pomysł?
erix
Cytat
Nie wiem jak takie błędy wywołać ale skoro tamten błąd sie pojawił to inne też zapewne sie pojawią.

Błąd składni uniemożliwia działanie skryptu.

Reszta (notice, warning) nie.

Cytat
Ale pliku php nie można podejrzeć podobno, tylko jakimiś zapytaniami lub jakoś inaczej. Są też programy do ściągania stron ale one tylko w html'u ściągają? albo sie myle?

Cytat
Jakich błędów sie wystrzegać by nikt np w swoim skrypcie includując mój index.php nie podejrzał zakładając ze w tym index.php jest hasło?


No, w Twoim wypadku jest OK; IMHO najbezpieczniej trzymać dane autoryzacyjne właśnie w ten sposób - jako parametry funkcji, a nie jako zmienne w jakimś pliku konfiguracyjnym. Można również w taki sposób, ale dodawaj np. usuwanie danych ze zmiennej konfiguracyjnej zaraz po podłączeniu, wyłącz wyświetlanie błędów, a jeśli nie chcesz (czasem się przyda), to utwórz własnego handlera (patrz: set_error_handler" title="Zobacz w manualu PHP" target="_manual i np. loguj je do pliku.

Cytat
Zastosowałem mysql_escape_string razem z htmlspecialchars. Czy może to tak być?

Do md5" title="Zobacz w manualu PHP" target="_manual nie musisz żadnej funkcji zabezpieczającej stosować, bo ona Ci nie zwróci żadnych znaków, które mogłbyby "popsuć" zapytanie (pomijam przypadek, w którym funkcja byłaby uszkodzona, ale dużo bardziej jest prawdopodobne, że ktoś włamie się na serwer i podejrzy interesujące go pliki). Swoją drogą, nie rozumiem, po co dodatkowo dajesz htmlspecialchars" title="Zobacz w manualu PHP" target="_manual przy zapytaniu. Bardziej kłopotliwe, bo znaki specjalne zamieni na encje (więcej miejsca w bazie; nazbiera się więcej loginów i trochę miejsca zajmie. Fakt, wartości znikome, ale grosik do grosika...).
pyro
jezeli serwer bedzie mial wylaczone magic_quotes to nie bedzie ten skrypt(y) zbyt bezpieczny, ja bym dal na poczatku kazdego z tych skrypotow taka linijke:

  1. <?php
  2. if(!get_magic_quotes_gpc){die("niech to szlag, wylaczone magic quotes ;/");}
  3. ?>
Crozin
index.php:
  1. <?
  2.  
  3. $login = $_POST["login"];
  4. $haslo = $_POST["haslo"];
  5.  
  6.  
  7. if(empty($_SESSION["zalogowany"]))$_SESSION["zalogowany"]=0;
  8.  
  9. mysql_connect("", "", "")or die("Nie można nawiązać połączenia z bazą");
  10. mysql_select_db("")or die("Wystąpił błąd podczas wybierania bazy danych");
  11.  
  12. function ShowLogin($komunikat=""){
  13. echo "$komunikat<br>";
  14. echo "<form action='index.php' method=post>";
  15. echo "Login: <input type=text name=login><br>";
  16. echo "Hasło: <input type=text name=haslo><br>";
  17. echo "<input type=submit value='Zaloguj!'>";
  18. echo "</form>";
  19. echo "Jeśli nie jesteś zarejestrowany, <a href='rejestruj.php'>tu znajdziesz formularz</a>";
  20. }
  21.  
  22. ?>
  23. <!DOCTYPE html 
  24. PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN">
  25.  <html>
  26. <head>
  27. <title>logowanie</title>
  28. </head>
  29. <body>
  30. <?php
  31. if($_GET["wyloguj"]=="tak"){$_SESSION["zalogowany"]=0;echo "Zostałeś wylogowany";}
  32. if($_SESSION["zalogowany"]!=1){
  33. if(!empty($login) && !empty($haslo)){
  34.  if(preg_match('#^[A-Za-z0-9_-]+$#', $login)){
  35. if(mysql_num_rows(mysql_query("select * from users where user_login = '".mysql_real_escape_string($login)."' AND user_haslo = '".md5($haslo)."'"))){
  36. echo "Zalogowano poprawnie. <a href='index.php'>Przejdź na stronę główną</a>";
  37. $_SESSION["zalogowany"]=1;
  38. $_SESSION['nick'] = $login;
  39. }else 
  40. echo ShowLogin("zle haslo!!!");  
  41.  }else 
  42.  echo ShowLogin("nie dozwolone znaki");
  43. }echo 
  44. ShowLogin("wprowadz login i haslo");
  45. }else{
  46. ?>
  47. Zalogowałeś się pomyślnie!
  48. <br><a href='index.php?wyloguj=tak'>wyloguj się</a>
  49. <?php
  50. }
  51. ?>
  52.  
  53. </body>
  54.  </html>
rejestracja.php:
  1. <?php
  2. mysql_connect("", "", "")or die("Nie można nawiązać połączenia z bazą"); //połączenie z bazą danych
  3. mysql_select_db("")or die("Wystąpił błąd podczas wybierania bazy danych");
  4.  
  5. $login = $_POST["login"];
  6. $haslo = $_POST["haslo"];
  7.  
  8. function ShowForm($komunikat=""){ //funkcja wyświetlająca formularz rejestracyjny
  9. echo "$komunikat<br>";
  10. echo "<form action='rejestruj.php' method=post>";
  11. echo "Login: <input type=text name=login><br>";
  12. echo "Hasło: <input type=text name=haslo><br>";
  13. echo "<input type=hidden value='1' name=send>";
  14. echo "<input type=submit value='Zarejestruj'>";
  15. echo "</form>";
  16. }
  17. ?>
  18. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN">
  19.  <html>
  20. <head>
  21. <title>Formularz rejestracyjny</title>
  22. </head>
  23. <body>
  24. <?php
  25. if($_POST["send"]==1){ //sprawdzanie czy formularz został wysłany
  26. if(!empty($login) && !empty($haslo)){ //oraz czy uzupełniono wszystkie dane
  27. if(preg_match('#^[A-Za-z0-9_-]+$#', $login)){ //sprawdzenie poprawnosci znaków
  28. if(mysql_num_rows(mysql_query("select * from users where user_login='".mysql_real_escape_string($login)."'")))
  29. ShowForm("Użytkownik o podanym loginie już istnieje!!!");// sprawdzanie czy użytkownik o podanej nazwie już istnieje
  30. else{
  31. mysql_query("insert into users values(NULL, '".mysql_real_escape_string($login)."', '".md5($haslo)."')"); // zapisywanie rekordu do bazy
  32. echo "Rejestracja przebiegła pomyślnie. Możesz teraz przejść do <a href='index.php'>strony głównej</a> i się zalogować.";
  33. }
  34. }else 
  35. ShowForm("nie dozwolone znaki");
  36. }else 
  37. ShowForm("Nie uzupełniono wszystkich pól!!!");
  38. }else 
  39. ShowForm();
  40.  
  41. ?>
  42. </body>
  43. </html>
A za każdym razem, gdy wyświetlasz login (czy jakieś dane od użytownika) już na stronie - wtedy potraktuje te dane htmlspecialchars" title="Zobacz w manualu PHP" target="_manual()
predator
Cytat
Tak sie zastanawiam i przecież te polecenia z formularza są najpierw wysyłane do serwera i on je analizuje. Więc w bazie danych nic nikt nie namiesza ale na serwerze chyba może.

czy dobrze mówie?
----
właśnie do pliku błędy chciałbym by zapisywało ale co mam wpisać? (nie uczyłem sie w szkole angielskiego i z tej strony nie bardzo rozumiem tych wyjaśnień :/)
Cytat
Swoją drogą, nie rozumiem, po co dodatkowo dajesz htmlspecialchars przy zapytaniu.

Cytat
A za każdym razem, gdy wyświetlasz login (czy jakieś dane od użytownika) już na stronie - wtedy potraktuje te dane htmlspecialchars()

te pola (obydwa pętlami zabezpieczyłem) mimo że zabezpieczone to gdyby komuś jakimś cudem udało sie wprowadzić inne znaki niż te dozwolone to wtedy htmlspecialchars zabezpieczy.
Cytat
jezeli serwer bedzie mial wylaczone magic_quotes to nie bedzie ten skrypt(y) zbyt bezpieczny

a co ktoś może zrobić?

--EDIT--
Kod
'".md5($haslo)."'
nawet gdyby ktoś wpisał coś nie dobrego to md5 itak to zakoduje więc chyba jednak nie potrzebne dodatkowo htmlspecialchars.

Jeśli wpisze w polu input cyfrę: 0 to informuje mnie ze nie wypelnłem wszystkich pól. Jak zrobić by 0 było traktowane nie jako puste pole a znak? Bo zamiast "nie wypełniłeś wszystkich pól" chciałbym by informowało po wprowadzeniu cyfry 0 że nie poprawne dane

Cytat
}echo
ShowLogin("wprowadz login i haslo");

Crozin. Nie wiem dlaczego ale zamiast echo musze wpisać tu else. Gdy jest echo to jeśli wpisze błędne dane to pojawia sie "złe hasło" a pod formularzem pojawia sie następny formularz "wprowadz login i haslo". Jeśli wpisze inne niż dozwolone znaki to zamiast "nie dozwolone znaki" pojawia sie "wprowadz login i haslo", pod spodem nie pojawia sie następny formularz wtedy.

Przecież jesli sprawdza czy pola puste:
  1. <?php
  2. if(!empty($login) && !empty($haslo)){
  3. [...]
  4.  }else
  5. ShowLogin("wprowadz login i haslo");
  6. ?>

i warunek jest że gdy nie (else) są puste to wypisz "wprowadz login i haslo"

To dlaczego gdy są puste, wyświetla "wprowadz login i haslo"? Przecież powinno wyświetlać tak gdy nie są puste. Z else działa ale nie rozumiem dlaczego.
erix
Cytat
te pola (obydwa pętlami zabezpieczyłem) mimo że zabezpieczone to gdyby komuś jakimś cudem udało sie wprowadzić inne znaki niż te dozwolone to wtedy htmlspecialchars zabezpieczy.

Jak zabezpieczysz przy rejestrowaniu usera (INSERT), to się tam nie dostaną więcej. ;]

No chyba, że w bazie albo w plikach ktoś namiesza.

Cytat
właśnie do pliku błędy chciałbym by zapisywało ale co mam wpisać? (nie uczyłem sie w szkole angielskiego i z tej strony nie bardzo rozumiem tych wyjaśnień :/)

http://www.google.com/search?client=opera&...-8&oe=utf-8

Cytat
Jeśli wpisze w polu input cyfrę: 0 to informuje mnie ze nie wypelnłem wszystkich pól. Jak zrobić by 0 było traktowane nie jako puste pole a znak? Bo zamiast "nie wypełniłeś wszystkich pól" chciałbym by informowało po wprowadzeniu cyfry 0 że nie poprawne dane


  1. <?php
  2. (string)$zmienna
  3. ?>


Cytat
i warunek jest że gdy nie (else) są puste to wypisz "wprowadz login i haslo"

A wpisywałeś 0 (zero), pusty ciąg, itp?
predator
Kod
<?php
(string)$zmienna
?>


nie rozumiem, jak mam tego użyć?

Napisze co chce zrobić. Chciałbym by po wprowadzeniu liczby, skrypt sprawdzał czy jest poprawna, jeśli tak to mógł być wykonywany następny warunek.
Mam taki kod, ale chciałbym więcej liczb zdefiniować a nie tylko 2 i by na 0 reagowało jak na źle wprowadzony kod a nie puste pole (z tym zerem tak jak tu napisałem nie działa ale taki warunek bym chciał zrobić):
Kod
$asd = "0";


  1. <?php
  2. if($_POST["kod"]=="$asd"){ echo "wpisałeś tylko liczbę 0";}
  3. else { if($_POST["kod"]== "2"){ tu nastepne warunki }
  4. }
  5. ?>


Cytat
A wpisywałeś 0 (zero), pusty ciąg, itp?

nic nie wpisywałem i nie powinno sie wyświetlać nic nawet przy uruchomieniu skryptu odrazu też nie powinno jeśli dam else zamiast echo bo przecież nic nie zostało wprowadzone a warunek sprawdza czy pola są puste
erix
Cytat
nie rozumiem, jak mam tego użyć?

Tak, jak pokazałem. empty" title="Zobacz w manualu PHP" target="_manual zwraca true, jeśli wartość jest 0 (zero/false), '' (pusty string), null.

Rzutowanie na stringa zwróci 0 jako ciąg znaków, a nie liczbę, na którą wskazuje false. A używa się tego np. tak:

  1. <?php
  2. empty((string)$zmienna);
  3. ?>


Cytat
Mam taki kod, ale chciałbym więcej liczb zdefiniować a nie tylko 2 i by na 0 reagowało

Wszystkie liczby? is_numeric" title="Zobacz w manualu PHP" target="_manual/is_int" title="Zobacz w manualu PHP" target="_manual

Cytat
To dlaczego gdy są puste, wyświetla "wprowadz login i haslo"? Przecież powinno wyświetlać tak gdy nie są puste. Z else działa ale nie rozumiem dlaczego.

Yyyy, ale po co pole login/hasło, gdy są one podane...?

Wywal wykrzykniki przed empty" title="Zobacz w manualu PHP" target="_manual, to będziesz miał, jak chcesz... Choć nie rozumiem trochę, po co...
predator
Cytat
Choć nie rozumiem trochę, po co...
nie rozumiemy sie chyba dlatego podam linka,
http://www.3xori.yoyo.pl/index.php
wpisz w obydwu polach np. aaaaabbbbbbbbb, później w jednej lub obu wpisz np znaki ;;;;; i zobaczysz że jeśli nie poprawne hasło lub login to pojawia sie pod spodem następny formularz no i właśnie dlaczego on sie tam pojawia (gdy jest echo) nie wiem. Gdy jest else to jest ok ale nie logiczne to troche bo else z tego co wiem wykonuje coś jeśli warunek nie został spełniony czyli jeśli pola nie są puste.
Cytat
Jeśli wpisze inne niż dozwolone znaki to zamiast "nie dozwolone znaki" pojawia sie "wprowadz login i haslo", pod spodem nie pojawia sie następny formularz wtedy.

teraz jest ok ale tylko to że sie pojawia formularz następny mnie wkurza

Cytat
Wszystkie liczby?

o to mi chodziło że chciałbym tam kilka liczb np 122, 3, 34 zapisać tak jak hasła ale jeśli wpisze
Kod
if($_POST["kod"]== ("122" or "3" or "34"))

to wtedy cokolwiek nie wpisze to zawsze przechodzi do następnych warunków
--EDIT--
Cytat
o to mi chodziło że chciałbym tam kilka liczb np 122, 3, 34 zapisać tak jak hasła ale jeśli wpisze
Kod
if($_POST["kod"]== ("122" or "3" or "34"))

to wtedy cokolwiek nie wpisze to zawsze przechodzi do następnych warunków

z tym sobie poradziłem, zaćmienie jakieś miałem przedtem, wystarczyło napisać
Kod
if(($_POST["kod"]== "122") or ($_POST["kod"]== "3") or ($_POST["kod"]== "34") itd
erix
Cytat
teraz jest ok ale tylko to że sie pojawia formularz następny mnie wkurza

Napisałem, wywal wykrzykniki przy empty" title="Zobacz w manualu PHP" target="_manual w tamtym warunku.

Cytat
o to mi chodziło że chciałbym tam kilka liczb np 122, 3, 34 zapisać tak jak hasła ale jeśli wpisze


  1. <?php
  2. if($_POST["kod"]=="$asd"){ echo "wpisałeś tylko liczbę 0";}
  3. else { if($_POST["kod"]== "2"){ tu nastepne warunki }
  4. }
  5. ?>

na:

  1. <?php
  2. switch($_POST['kod']){
  3. case 1:
  4.  //kod "1"
  5. break;
  6. case 200:
  7.  //kod "200"
  8. break;
  9. case 102:
  10.  //kod "102"
  11. break;
  12. default:
  13. //jakiś inny
  14. }
  15. ?>


O to chodzi?
predator
nie, nie już poradziłem sobie z tamtym smile.gif

Cytat
Napisałem, wywal wykrzykniki przy empty w tamtym warunku.

Po wywaleniu wykrzykników odrazu przy uruchomieniu są 2 formularze sciana.gif
erix
  1. <?php
  2. if($_POST["send"]==1){ //sprawdzanie czy formularz został wysłany
  3. if(!empty($login) && !empty($haslo)){ //oraz czy uzupełniono wszystkie dane
  4. if(preg_match('#^[A-Za-z0-9_-]+$#', $login)){ //sprawdzenie poprawnosci znaków
  5. if(mysql_num_rows(mysql_query("select * from users where user_login='".mysql_real_escape_string($login)."'")))
  6. ShowForm("Użytkownik o podanym loginie już istnieje!!!");// sprawdzanie czy użytkownik o podanej nazwie już istnieje
  7. else{
  8. mysql_query("insert into users values(NULL, '".mysql_real_escape_string($login)."', '".md5($haslo)."')"); // zapisywanie rekordu do bazy
  9. echo "Rejestracja przebiegła pomyślnie. Możesz teraz przejść do <a href='index.php'>strony głównej</a> i się zalogować.";
  10. }
  11. }else 
  12. ShowForm("nie dozwolone znaki");
  13. }else 
  14. ShowForm("Nie uzupełniono wszystkich pól!!!");
  15. }else 
  16. ShowForm();
  17. ?>


Zakładam, że masz PHP5:

  1. <?php
  2. try{
  3.  
  4.  if($_POST["send"]==1){ //sprawdzanie czy formularz został wysłany
  5. if(!empty($login) && !empty($haslo)){ //oraz czy uzupełniono wszystkie dane
  6. if(preg_match('#^[A-Za-z0-9_-]+$#', $login)){ //sprawdzenie poprawnosci znaków
  7. if(mysql_num_rows(mysql_query("select * from users where user_login='".mysql_real_escape_string($login)."'")))
  8. throw new Exception('Użytkownik o podanym loginie już istnieje!!!');
  9. else{
  10. mysql_query("insert into users values(NULL, '".mysql_real_escape_string($login)."', '".md5($haslo)."')"); // zapisywanie rekordu do bazy
  11. echo "Rejestracja przebiegła pomyślnie. Możesz teraz przejść do <a href='index.php'>strony głównej</a> i się zalogować.";
  12. }
  13. }else 
  14. throw new Exception("nie dozwolone znaki");
  15. }else 
  16. throw new Exception("Nie uzupełniono wszystkich pól!!!");
  17. }else 
  18. throw new Exception();
  19.  
  20. }catch(Exception $ex){
  21. ShowForm($ex->getMessage());
  22. }
  23. ?>
Mlodycompany
i jeszcze jedna moja uwaga. Przy wylogowywaniu zamiast $_SESSION["zalogowany"] zmieniac na 0 to zrob session_destroy();
predator
Chodziło o index.php bo tam jest to echo.
Poprawiłem index.php podobnie jak Ty ten drugi plik ale pojawia sie błąd
Parse error: syntax error, unexpected T_CATCH
Ale czy gdy tu (w tym nie poprawnionym pliku):
Kod
}echo
              ShowLogin("wprowadz login i haslo");

Zamiast echo dam else to będzie poprawnie? Jak już mówiłem z else działa ale wydaje mi sie to nie poprawne.
erix
Ja bym proponował Ci poprawić wszystkie klamry (nawet te opcjonalne; z jedną instrukcją), wtedy nikt się nie pogubi.

Cytat
Parse error: syntax error, unexpected T_CATCH

Poprawiłeś, ale ciężko mi cokolwiek powiedzieć, bo zmienionego kodu nie widzę; klamry może gdzieś zapomniałeś?
predator
Już rozumiem jak to działa, musi być else echo bo w funkcji jest zapytanie czy nie są pola puste. I else to zaprzecza i powstaje pytanie "czy są pola puste" i jesli są to wyswietla odpowiednia informacje. Nie brałem przedtem wykrzykników pod wage i dlatego mi sie wydawało że jest źle i głowiłem sie dlaczego działa skoro jest źle. guitar.gif

--EDIT--
Co do tych errorów to dam sobie spokój z zapisywaniem do pliku chyba, za trudne to. Wyłączyłem errory za pomocą error_reporting(0); ale parse errory dalej sie pojawiają :/
-predator-
Cytat(erix)
  1. <?php
  2. empty((string)$zmienna);
  3. ?>


napisałem tak:
Kod
if(!empty((string)$login) && !empty((string)$haslo)){

i nie działa... (Parse error: syntax error, unexpected T_STRING_CAST, expecting T_VARIABLE or '$' )

w miejsce "string" wisywałem też 0 ale nie działa też (Parse error: syntax error, unexpected '(', expecting T_VARIABLE or '$')

// Na przyszłość używaj opcji edytuj, a nie pisz pod swoimi postami.
// ~webdicepl
potreb
  1. <?php
  2. if(!$login && !$haslo){
  3. }
  4. ?>
predator
Cytat
i jeszcze jedna moja uwaga. Przy wylogowywaniu zamiast $_SESSION["zalogowany"] zmieniac na 0 to zrob session_destroy();

Nie wiem czy to coś daje gdy zaraz po session_destroy(); wypisuje tamto ale gdy nie napisze $_SESSION["zalogowany"]=0; lub $_SESSION["zalogowany"]; to nie działa.
Tak to napisałem:
  1. <?php
  2. if($_GET["wyloguj"]=="tak"){ session_destroy();
  3. $_SESSION["zalogowany"]=0;
  4. }
  5. ?>


potreb, zrobiłem tak jak Ty proponujesz i mieszają sie komunikaty a niektóre nie pojawiają sie nigdy.

Może jakiś inny sposób?
erix
Cytat
ale parse errory dalej sie pojawiają :/

To popraw kod, aby ich nie było. Może brakujący średnik/cudzysłów/etc? Wykaż trochę swojej inwencji i zajrzyj do manuala/googli.

Cytat
unexpected T_STRING_CAST, expecting T_VARIABLE or '$' )

empty" title="Zobacz w manualu PHP" target="_manual nie jest funkcją; to konstrukcja języka, a przy tym nie możesz korzystać z rzutowania.

Cytat
  1. <?php
  2. $login = $_POST["login"];
  3. $haslo = $_POST["haslo"];
  4. ?>


Zmień ten kawałek z empty" title="Zobacz w manualu PHP" target="_manual w warunku na taki, jak potreb proponuje. Za to pogrzeb z tym kodem, co zacytowałem, wg przykładu:
  1. <?php
  2. $login = isset($_POST["login"]) ? $_POST['login'] : false;
  3. ?>


Swoją drogą, tak trochę zbaczając z tematu, to po co Ci login/hasło o wartości wyłącznie "0"...? IMHO, trochę bez sensu...
predator
Cytat
Swoją drogą, tak trochę zbaczając z tematu, to po co Ci login/hasło o wartości wyłącznie "0"...? IMHO, trochę bez sensu...


Nie...
Mam formularz i jak ktoś wpisze hasła błędne to wyświetla mu że błędne, jeśli ktoś nie wpisze nic lub uzupełni tylko jedno pole to pojawia sie informacja że musi wypelnić pola wszystkie. I teraz o to mi chodzi że ktoś np wpisuje login jakiś i później sobie np. zapomniał hasła i wpisze liczbe 0 zamiast np 1 czy 55 lub celowo wpisze jako hasło liczbe zero i zamiast pojawić sie informacja że dane są nie poprawne to formularz reaguje tak jakby ten koleś nie wypełnił wszystkich pól a przecież wypełnił (tyle że wpisał 0).

Chce po prostu by formularz po wprowadzeniu liczby 0 czy to w polu login czy w polu hasło informował ze jest to nie poprawne hasło a nie jak teraz że nie zostało nic wprowadzone.

Cytat
Cytatale parse errory dalej sie pojawiają :/
To popraw kod, aby ich nie było. Może brakujący średnik/cudzysłów/etc? Wykaż trochę swojej inwencji i zajrzyj do manuala/googli.


Chodziło mi tu nie o to że coś w kodzie źle napisałem tylko zwyczajnie chciałem takie zabezpieczenie później zrobić po napisaniu już kodu by użytkownik nie widział błędów (jeśli by ewentualnie jakieś miały miejsce). Ale ta funkcja (error_reporting(0)winksmiley.jpg nie blokuje błędów parsowania.
erix
Cytat
Ale ta funkcja (error_reporting(0) nie blokuje błędów parsowania.

Bo błąd parsowania wstrzymuje dalsze wykonywanie skryptu, to nie ma to sensu. tongue.gif

Poza tym, masz wartość display_errors w php.ini, poszukaj sobie.

Cytat
Chce po prostu by formularz po wprowadzeniu liczby 0 czy to w polu login czy w polu hasło informował ze jest to nie poprawne hasło a nie jak teraz że nie zostało nic wprowadzone.

To Ci podałem przepis z isset" title="Zobacz w manualu PHP" target="_manual.
predator
Cytat
To Ci podałem przepis z isset.


też nie działa jak powinno sciana.gif sadsmiley02.gif
erix
A jaki kod Ci teraz wyszedł...?

Co masz na myśli pisząc, że nie działa jak powinno?
predator
Cytat
A jaki kod Ci teraz wyszedł...?


Kod
  $login = isset($_POST["login"]) ? $_POST['login'] : false;
  $haslo = isset($_POST["haslo"]) ? $_POST['haslo'] : false;


a później napisałem to
Kod
if(!$login && !$haslo){


Cytat
Co masz na myśli pisząc, że nie działa jak powinno?

że dalej jest tak samo jak wtedy co pisałem to:
Cytat
potreb, zrobiłem tak jak Ty proponujesz i mieszają sie komunikaty a niektóre nie pojawiają sie nigdy.


czyli z tym isset nie wyszło sciana.gif
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.