eremen
21.02.2012, 18:52:53
$plik = "kody.txt"; //deklaracja ścieżki do pliku
$test = file_exists($plik); //sprawdzenie czy plik istnieje
if (!$test){
//GENEROWANIE KODU 5-CYFROWEGO
for ($s=0; $s<50; $s++){
// obliczamy ilość znaków w tekscie
// sprawdzamy, czy ilość znaków w tekscie jest większa
// lub równa liczbie znaków po jakiej tekst ma być obcięty
if ($licz>=5){
// obcinamy tekst o określoną ilośc znaków
}
else{
// jeżeli warunek nie jest spełniony pozostawiamy tekst bez zmian
$txt = $kod;
}
$kody[] = $txt; // tutaj zapisujemy okrojony kod do tablicy
}
file_put_contents
('./kody.txt', implode(PHP_EOL
, $kody));}
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
21.02.2012, 20:51:57
Zapisz informacje w sesji lub ciastku i sprawdzaj ifem czy już istnieje.
eremen
21.02.2012, 20:56:15
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
21.02.2012, 21:07:52
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
21.02.2012, 21:20:52
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 ;]
fopen("./kody.txt", "w+"); chmod("kody.txt", 0777);
camikazee
21.02.2012, 21:36:54
Ogólnie kod jest poprawny. Ale weź ustal ścieżkę dla pliku w obu miejscach kody.txt zamiast ./kody.txt
eremen
21.02.2012, 21:40:42
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
21.02.2012, 21:50:34
file_put_contents(kody.txt) tu oczywiście masz cudzysłów? Jakie są prawa dla katalogu, w którym znajduje się plik?
eremen
21.02.2012, 21:58:51
trafiłeś w sedno

nie zmieniłem kodowania katalogu a było 755 teraz mam 777 i wygląda ok

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
21.02.2012, 22:01:56
$kody nie jest tablicą. Możesz to sprawdzić warunkiem is_array($kody).
eremen
21.02.2012, 22:07:59
$kody[] = $txt; // tutaj zapisujemy okrojony kod do tablicy
}
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
21.02.2012, 22:29:15
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
21.02.2012, 22:35:36
<?php
//SPRAWDZANIE CZY PLIK ISTNIEJE
$plik = "kody.txt";
if (!$istnieje){
//GENEROWANIE KODU 5-CYFROWEGO
for ($s=0; $s<50; $s++){
// obliczamy ilość znaków w tekscie
// sprawdzamy, czy ilość znaków w tekscie jest większa
// lub równa liczbie znaków po jakiej tekst ma być obcięty
if ($licz>=5){
// obcinamy tekst o określoną ilośc znaków - 5
}
else{
// jeżeli warunek nie jest spełniony pozostawiamy tekst bez zmian
$txt = $kod;
}
$kody[] = $txt; // tutaj zapisujemy okrojony kod do tablicy
}
file_put_contents
("kody.txt", implode(PHP_EOL
, $kody));}
//-------------------------------------------------------------------
//GŁOSOWANIE PO WPISANIU HASLA
//ZAPISYWANIE WYNIKOW DO PLIKOW
$error = "dziękujemy za oddanie głosu";
}
elseif($_POST['glosuj'] && !isset($_POST['haslo'])){ $error = "nie wpisałeś hasła";
}
elseif($_POST['glosuj'] && !in_array($_POST['haslo'], $kody)){ <-- i tu też
$error = "wpisałeś niepoprawne hasło";
}
//------------------------------------------------------------------
/*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
21.02.2012, 22:48:05
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.
<?php
//SPRAWDZANIE CZY PLIK ISTNIEJE
$plik = "kody.txt";
for ($s=0; $s<50; $s++){
}
else{
$txt = $kod;
}
$kody[] = $txt; // tutaj zapisujemy okrojony kod do tablicy
}
file_put_contents
("kody.txt", serialize($kody)); }
else{
}
if (isset($_POST['haslo']) && $_POST['glosuj']) { //ZAPISYWANIE WYNIKOW DO PLIKOW
$error = "dziękujemy za oddanie głosu";
}
else {
$error = "wpisałeś niepoprawne hasło";
}
}
elseif ($_POST['glosuj'] && !isset($_POST['haslo'])){ $error = "nie wpisałeś hasła";
}
/*POKAZUJE SONDE*/
?>
eremen
21.02.2012, 22:59:31
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
21.02.2012, 23:02:52
Usuń stary plik kody.txt, niech wygeneruje nowy.
eremen
21.02.2012, 23:08:40
ha! funkcjonuje
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
camikazee
21.02.2012, 23:10:08
Wiesz, to jest jeden z miliona sposobów w jaki można rozwiązać, te zadanie.
Grunt, że działa i jesteś zadowolony

I pamiętaj, manual Twoim przyjacielem
eremen
21.02.2012, 23:40:33
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:
if (isset($_POST['haslo']) && $_POST['glosuj']) { //ZAPISYWANIE WYNIKOW DO PLIKOW
$error = "dziękujemy za oddanie głosu";
}
else {
$error = "wpisałeś niepoprawne hasło";
}
}
elseif ($_POST['glosuj'] && !isset($_POST['haslo'])){ $error = "nie wpisałeś hasła";
}
//ZAPISYWANIE WYNIKOW DO PLIKOW to inaczej kod:
if(isset($_POST['auto1']) && $_POST['auto1'] != ''){ $filename1 = $_POST['auto1'] . '.txt';
$auto1++;
$fileHandler=fopen("auto1.txt","w"); fputs($fileHandler,$auto1); }
elseif(isset($_POST['auto2']) && $_POST['auto2'] != ''){ $filename2 = $_POST['auto2'] . '.txt';
$auto2++;
$fileHandler=fopen("auto2.txt","w"); fputs($fileHandler,$auto2); }
i tak aż do auto10 ;]
wcześniej działało bez problemu...
camikazee
22.02.2012, 08:52:22
Trochę dziwna ta sonda

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.
for($i = 1; $i < 11; $i++){
$name = 'auto'.$i;
if ($_POST[$name] != ''){
$filename = $_POST[$name].'.txt';
$votes = 0;
$votes++;
}
file_put_contents($filename, $votes);
}
}
eremen
22.02.2012, 10:31:59
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.