Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: generowanie haseł tylko gdy plik nie istnieje
Forum PHP.pl > Forum > PHP
eremen
  1. $plik = "kody.txt"; //deklaracja ścieżki do pliku
  2. $test = file_exists($plik); //sprawdzenie czy plik istnieje
  3.  
  4. if (!$test){
  5. //GENEROWANIE KODU 5-CYFROWEGO
  6. for ($s=0; $s<50; $s++){
  7. srand((double)microtime()*1000000);
  8. $kod=md5(uniqid(rand()));
  9. // obliczamy ilość znaków w tekscie
  10. $licz = strlen($kod);
  11. // sprawdzamy, czy ilość znaków w tekscie jest większa
  12. // lub równa liczbie znaków po jakiej tekst ma być obcięty
  13. if ($licz>=5){
  14. // obcinamy tekst o określoną ilośc znaków
  15. $txt = substr($kod,0,5);
  16. }
  17. else{
  18. // jeżeli warunek nie jest spełniony pozostawiamy tekst bez zmian
  19. $txt = $kod;
  20. }
  21. $kody[] = $txt; // tutaj zapisujemy okrojony kod do tablicy
  22. }
  23. file_put_contents('./kody.txt', implode(PHP_EOL, $kody));
  24. }

w tym kodzie chciałbym aby pierwszy if sprawdzał czy istnieje plik w którym będzie wykonywana reszta operacji. Czyli żeby kody zapisywały się tylko za pierwszym otworzeniem strony, bo teraz aktualizuje się za każdym razem i nie mogę przez to wysłać formularza ;]
camikazee
Zapisz informacje w sesji lub ciastku i sprawdzaj ifem czy już istnieje.
eremen
a ta metoda którą robię jest zła? Chciałem po prostu dodać kod który sprawdza czy jest plik i jeśli go nie ma to tworzenie go i wykonanie tego mojego generowania haseł. Jeśli plik by istniał po prostu generowanie było by omijanie. Czy to nie prostsza metoda?? Tylko właśnie coś nie działa ;/
camikazee
Chyba nie do końca rozumiem o co tu chodzi.
Masz skrypt, który sprawdza istnienie pliku kody.txt, w przypadku gdy go nie ma, zostaje wygenerowany wraz z zawartością 50 losowych kodów, takie jest zamierzenie? I za każdym razem skrypt nie znajduje tego pliku?
eremen
sory, może ja źle wytłumaczyłem.
Na początku zrobiłem kod który generuje hasła do pliku. Było ok do puki nie zauważyłem że nie mogę wpisać poprawnego hasła i kliknąć 'głosuj'(działanie na zasadzie : możesz głosować jak wpiszesz hasło). Myślę że przyczyną jest to że za każdym razem gdy otwiera się strona hasła są generowane do pliku na nowo.
I to chciałem zmienić dodając pierwszą część kodu która miała sprawdzać czy plik istnieje i jeśli nie tworzyć go, a przez warunek if'em zablokować generowanie gdy już będzie istniał plik.

próbowałem dodać ten kod zaraz za if'em i zaraz przed kodem generującym hasła ale nie pomogło ;]
  1. fopen("./kody.txt", "w+");
  2. chmod("kody.txt", 0777);
camikazee
Ogólnie kod jest poprawny. Ale weź ustal ścieżkę dla pliku w obu miejscach kody.txt zamiast ./kody.txt
eremen
Wyskakuje błąd w linii gdzie jest file_put_contents
Warning: file_put_contents(kody.txt) [function.file-put-contents]: failed to open stream

a jeśli dodam kod fopen i chmod tam gdzie pisałem wyskakuje błąd w linii gdzie jest fopen...
camikazee
file_put_contents(kody.txt) tu oczywiście masz cudzysłów? Jakie są prawa dla katalogu, w którym znajduje się plik?
eremen
trafiłeś w sedno smile.gif nie zmieniłem kodowania katalogu a było 755 teraz mam 777 i wygląda ok wink.gif

pomożesz mi jeszcze z tym?

in_array($_POST['haslo'], $kody)

mam to w warunku, że jeśli będzie w polu tekstowym 'haslo' wpisany kod z tablicy $kody to wykonuje zapisanie głosu do pliku.
i wyskakuje mi błąd: Warning: in_array() [function.in-array]: Wrong datatype for second argument
camikazee
$kody nie jest tablicą. Możesz to sprawdzić warunkiem is_array($kody).
eremen
  1. $kody[] = $txt; // tutaj zapisujemy okrojony kod do tablicy
  2. }
  3. file_put_contents('./kody.txt', implode(PHP_EOL, $kody));

to jest końcówka kodu który generuje hasła i tam $kody jest tablicą, czy ja czegoś nie kumam? ;]

Proponujesz is_array, mam nim zastąpić to co miałem do tej pory czyli in_array? W ten sposób: is_array($_POST['haslo'], $kody)?
camikazee
Nie. Funkcją is_array możesz sprawdzić czy zmienna $kody jest tablicą. Wywołać mógłbyś ją przed in_array. Tylko znów czegoś nie rozumiem. Bo pokazałeś jedną funkcję, która generuje kody w przypadku braku pliku kody.txt. Teraz w przypadku gdy on istnieje, chcesz sprawdzić czy w jego zawartości znajduje się kod $_POST['haslo']? Zatem musisz napierw zczytać zawartość pliku kody.txt, wrzucić kody do tablicy i na końcu sprawdzić czy któryś jest równy $_POST['haslo']. W sumie łatwiej while odczytywać po kolei linie i sprawdzać czy któraś pasuje do $_POST['haslo']. W momencie wykrycia breakiem wychodzisz z pętli i zapisujesz głos.
eremen
  1. <?php
  2. //SPRAWDZANIE CZY PLIK ISTNIEJE
  3. $plik = "kody.txt";
  4. $istnieje = file_exists($plik);
  5. if (!$istnieje){
  6. //GENEROWANIE KODU 5-CYFROWEGO
  7. for ($s=0; $s<50; $s++){
  8. srand((double)microtime()*1000000);
  9. $kod=md5(uniqid(rand()));
  10. // obliczamy ilość znaków w tekscie
  11. $licz = strlen($kod);
  12. // sprawdzamy, czy ilość znaków w tekscie jest większa
  13. // lub równa liczbie znaków po jakiej tekst ma być obcięty
  14. if ($licz>=5){
  15. // obcinamy tekst o określoną ilośc znaków - 5
  16. $txt = substr($kod,0,5);
  17. }
  18. else{
  19. // jeżeli warunek nie jest spełniony pozostawiamy tekst bez zmian
  20. $txt = $kod;
  21. }
  22. $kody[] = $txt; // tutaj zapisujemy okrojony kod do tablicy
  23. }
  24. file_put_contents("kody.txt", implode(PHP_EOL, $kody));
  25. }
  26. //-------------------------------------------------------------------
  27.  
  28. //GŁOSOWANIE PO WPISANIU HASLA
  29. if(isset($_POST['haslo']) && in_array($_POST['haslo'], $kody) && $_POST['glosuj']){ <--tu jest in_array
  30. //ZAPISYWANIE WYNIKOW DO PLIKOW
  31. $error = "dziękujemy za oddanie głosu";
  32. }
  33. elseif($_POST['glosuj'] && !isset($_POST['haslo'])){
  34. $error = "nie wpisałeś hasła";
  35. }
  36. elseif($_POST['glosuj'] && !in_array($_POST['haslo'], $kody)){ <-- i tu też
  37. $error = "wpisałeś niepoprawne hasło";
  38. }
  39. //------------------------------------------------------------------
  40.  
  41.  
  42. /*POKAZUJE SONDE*/


To sprawdzanie czy plik istnieje ma mieć tylko zastosowanie do generowania kodów - żeby program nie robił tego za każdym razem.
A sprawdzanie, czy hasło jest poprawne, jest tak jakby w innym elemencie.
A nie da się zrobić tego taką metodą ? Po prostu żeby in_array sprawdzał czy hasło wpisane jest takim samym hasłem które znajduje się w (chciałbym) tablicy? I jeśli wszystko jest ok przystępuje do zapisywania głosowania.
camikazee
Aby uniknąć zapisywania haseł w nowych liniach, potem ich zczytywania, lepiej je zserializować, to szybciej wyszukasz je w tablicy. Nie testowałem tego, ale powinno być ok. Nie wrzucaj wszystkich komunikatów do zmiennej $error, lepiej już nazwać ją $message.

  1. <?php
  2. //SPRAWDZANIE CZY PLIK ISTNIEJE
  3. $plik = "kody.txt";
  4.  
  5. if (!file_exists($plik)) {
  6. for ($s=0; $s<50; $s++){
  7. srand((double)microtime()*1000000);
  8. $kod=md5(uniqid(rand()));
  9.  
  10. if (strlen($kod)>=5) {
  11. $txt = substr($kod,0,5);
  12. }
  13. else{
  14. $txt = $kod;
  15. }
  16. $kody[] = $txt; // tutaj zapisujemy okrojony kod do tablicy
  17. }
  18. file_put_contents("kody.txt", serialize($kody));
  19. }
  20. else{
  21. $kody = unserialize(file_get_contents('kody.txt'));
  22. }
  23.  
  24. if (isset($_POST['haslo']) && $_POST['glosuj']) {
  25. if (in_array($_POST['haslo'], $kody)){
  26. //ZAPISYWANIE WYNIKOW DO PLIKOW
  27. $error = "dziękujemy za oddanie głosu";
  28. }
  29. else {
  30. $error = "wpisałeś niepoprawne hasło";
  31. }
  32. }
  33. elseif ($_POST['glosuj'] && !isset($_POST['haslo'])){
  34. $error = "nie wpisałeś hasła";
  35. }
  36.  
  37. /*POKAZUJE SONDE*/
  38. ?>
eremen
nawet nie znałem takiej funkcji unserialize ;]

widzę że ta funkcja $kody = unserialize(file_get_contents('kody.txt')); ma główne znaczenie.. ok zaraz sprawdzę, czy działa ;]

i nadal jest błąd tam gdzie jest in_array, znowu wrong datatype for second argument ;]
camikazee
Usuń stary plik kody.txt, niech wygeneruje nowy.
eremen
ha! funkcjonuje smile.gif

nigdy bym nie wpadł że trzeba użyć takich funkcji, w sumie trochę mi głupio że ktoś musiał odwalić za mnie robotę w większym stopniu niż myślałem ale wielkie dzięki za pomoc smile.gif
camikazee
Wiesz, to jest jeden z miliona sposobów w jaki można rozwiązać, te zadanie.
Grunt, że działa i jesteś zadowolony smile.gif I pamiętaj, manual Twoim przyjacielem smile.gif
eremen
kurcze, działa tylko że teraz jak wysyłam formularz (wpisuję poprawne hasło -> głosuję) nie zapisuje mi się wynik do pliku ;O

fragment z poprzedniego postu:
  1. if (isset($_POST['haslo']) && $_POST['glosuj']) {
  2. if (in_array($_POST['haslo'], $kody)){
  3. //ZAPISYWANIE WYNIKOW DO PLIKOW
  4. $error = "dziękujemy za oddanie głosu";
  5. }
  6. else {
  7. $error = "wpisałeś niepoprawne hasło";
  8. }
  9. }
  10. elseif ($_POST['glosuj'] && !isset($_POST['haslo'])){
  11. $error = "nie wpisałeś hasła";
  12. }


//ZAPISYWANIE WYNIKOW DO PLIKOW to inaczej kod:
  1. if(isset($_POST['auto1']) && $_POST['auto1'] != ''){
  2. $filename1 = $_POST['auto1'] . '.txt';
  3. $auto1 = file_get_contents($filename1);
  4. $auto1++;
  5. $fileHandler=fopen("auto1.txt","w");
  6. fputs($fileHandler,$auto1);
  7. fclose($fileHandler);
  8. }
  9.  
  10. elseif(isset($_POST['auto2']) && $_POST['auto2'] != ''){
  11. $filename2 = $_POST['auto2'] . '.txt';
  12. $auto2 = file_get_contents($filename2);
  13. $auto2++;
  14. $fileHandler=fopen("auto2.txt","w");
  15. fputs($fileHandler,$auto2);
  16. fclose($fileHandler);
  17. }
  18.  
  19. i tak aż do auto10 ;]


wcześniej działało bez problemu...
camikazee
Trochę dziwna ta sonda tongue.gif
Ale idąc tym tokiem rozumowania. Po co 10 razy robić warunki, jeżeli można to wrzucić w pętlę. Dziwna też sprawa z nazewnictwem plików, które przenoszą się zmienną POST. Ogólnie pamiętaj, że na chwilę obecną sonda posiada mnóstwo bugów i nie ma zabezpieczeń przed ponownym głosowaniem przez tego samego użytkownika.


  1. for($i = 1; $i < 11; $i++){
  2. $name = 'auto'.$i;
  3.  
  4. if ($_POST[$name] != ''){
  5. $filename = $_POST[$name].'.txt';
  6. $votes = 0;
  7.  
  8. if(file_exists($filename)){
  9. $votes = file_get_contents($filename);
  10. $votes++;
  11. }
  12.  
  13. file_put_contents($filename, $votes);
  14. }
  15. }
eremen
Pierwszy raz robię sondę dlatego tak topornie mi idzie ;P

Tu nie chodzi o to aby ktoś nie mógł głosować parę razy, może głosować tyle razy ile chce ale za każdym razem musi wpisać poprawne hasło.
Z resztą ta ankieta nie będzie puki co dostępna dla użytkownika, kody będą tylko w pliku i nikt ich nie zobaczy prócz mnie ;] Po prostu chcę zrobić system głosowania po wpisaniu hasła.

Wiedziałem że można zautomatyzować te 10 kodków zapisywania do plików ale puki działało było ok ;]

w ogóle dziwna sytuacja.. jak otwieram sondę za 1. razem gdy nie ma jeszcze pliku kody.txt nie tworzy się on od razu na serwerze, gdy wrzucę jeszcze raz plik sonda.php na serwer, plik z kodami tworzy się dopiero wtedy.. a pliki z hasłami nadal się nie tworzą <olaboga>
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.