[PHP] sonda - bardzo skomplikowany problem - POMOCY ! ! ! - eremen - 18-02-2012
- żeby oddać głos trzeba podać 5-znakowy kod z listy (lista w pliku z kodami, wygenerowanymi losowo ciągami 5 znaków, każdy kod w osobnej linii pliku, kody nie powtarzają się mechanizm sprawdza, czydany kod występuje na liście, a jeśli tak, zalicza głos i usuwa kod z listy)
- jedna osoba może oddać wiele razy głos, ale za każdym razem musi użyć nowego kodu
mam straszny problem żeby to zrobić wg. powyższych wytycznych;/
jak na razie zrobiłem tak:
Kod: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="pl" xml:lang="pl">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta http-equiv="Content-Language" content="pl" />
<meta name="Author" content="RW" />
<title>Sonda</title>
</head>
<body>
<?php
// ustalenie szerokosci w pikselach,
// jesli plik graficzny ma 1 px szerokosci
$szerokosc=200;
function prezentacja($szerokosc)
{
// odczyt pliku z pytaniem i odpowiedziami do tablicy $tresc
$tresc=explode("||",file_get_contents("tresc.php"));
// wyznaczenie liczby wierszy, ktora stanowia ilosc odpowiedzi plus pytanie
$ilosc=count($tresc);
// odczyt pliku z glosami
$glos=explode("||",file_get_contents("glosy.php"));
$suma=0;
for($c=0;$c<$ilosc;$c++)
$suma=$suma+$glos[$c];
echo '<p>'.$tresc[0];
for($c=1;$c<$ilosc;$c++)
{
echo '<BR />'.$tresc[$c];
$c--;
echo '<BR /> [ '.$glos[$c].' ] <BR />';
// graficzne wyswietlenie wynikow
for($i=0;$i<$glos[$c]/($suma+1)*$szerokosc;$i++)
echo '<img src="img.php" alt="">';
$c++;
}
echo '<BR /><BR />Suma głosów: '.$suma.'.</p>';
}
// jezeli wyslano dane z formularza
if ($wybor)
{
// odczyt pliku z pytaniem i odpowiedziami
$tresc=explode("||",file_get_contents("tresc.php"));
$ilosc=count($tresc);
// odczyt pliku z glosami
$glos=explode("||",file_get_contents("glosy.php"));
// uaktualnienie liczby glosow w pliku glosy.php
$fp=fopen("glosy.php","w");
// zwiekszenie o "1" odpowiedniego elementu tablicy, na ktory zaglosowano
$glos[$wybor-1]=$glos[$wybor-1]+1;
// zapis do pliku
fwrite($fp,implode("||",$glos));
fclose($fp);
}
// odczyt pliku z pytaniem i odpowiedziami
$tresc=explode("||",file_get_contents("tresc.php"));
$ilosc=count($tresc);
// odczyt pliku z glosami
$glos=explode("||",file_get_contents("glosy.php"));
/*POKAZUJE SONDE*/
echo '<p>'.$tresc[0].'<map glosuj="glosuj">
<form action="" method="post">
<table align="center" style="text-align:center;">
<tr>
<td>1.<img src="./zdjecia/auto1.jpg" alt="" glosuj="ramka"/></td>
<td>2.<img src="./zdjecia/auto2.jpg" alt="" glosuj="ramka"/></td>
<td>3.<img src="./zdjecia/auto3.jpg" alt="" glosuj="ramka"/></td>
<td>4.<img src="./zdjecia/auto4.jpg" alt="" glosuj="ramka"/></td>
<td>5.<img src="./zdjecia/auto5.jpg" alt="" glosuj="ramka"/></td>
</tr>
<tr>
<td>6.<img src="./zdjecia/auto6.jpg" alt="" glosuj="ramka"/></td>
<td>7.<img src="./zdjecia/auto7.jpg" alt="" glosuj="ramka"/></td>
<td>8.<img src="./zdjecia/auto8.jpg" alt="" glosuj="ramka"/></td>
<td>9.<img src="./zdjecia/auto9.jpg" alt="" glosuj="ramka"/></td>
<td>10.<img src="./zdjecia/auto10.jpg" alt="" glosuj="ramka"/></td>
</tr>
</table>
<div>
<input type="radio" name="wybor" value="1" /> nr 1.
<input type="radio" name="wybor" value="2" /> nr 2.
<input type="radio" name="wybor" value="3" /> nr 3.
<input type="radio" name="wybor" value="4" /> nr 4.
<input type="radio" name="wybor" value="5" /> nr 5.
<input type="radio" name="wybor" value="6" /> nr 6.
<input type="radio" name="wybor" value="7" /> nr 7.
<input type="radio" name="wybor" value="8" /> nr 8.
<input type="radio" name="wybor" value="9" /> nr 9.
<input type="radio" name="wybor" value="10" /> nr 10.
</div>
<p></p><div><br/>Wpisz hasło:<br/><input type="text" name="haslo" /><input type="submit" name="glosuj" value="Głosuj" /><br/><br/></form></map></p>';
/*POKAZUJE WYNIKI*/
echo prezentacja($szerokosc);
/*------------------------------------ODTĄD MAM PROBLEM----------------------------------------------------------------*/
//TUTAJ KOD SPRAWDZA CZY JEST HASŁO W PLIKU kody.txt I JAK JEST TO USUWA JE STAMTĄD
$wpisanyKlucz = htmlspecialchars(trim($_POST['haslo']));
$kody = file('./kody.txt');
if($klucz = in_array($wpisanyKlucz, $kody))
{
unset($kody[$klucz]);
file_put_contents('./kody.txt', implode("\n", $kody));
// TUTAJ CHCIAŁEM ZROBIĆ ŻEBY PO KLIKNIĘCIU 'glosuj' SPRAWDZAŁO BŁĘDY I WYSYŁAŁO ERROR WARUNKOWO
$wyslij = $_POST['glosuj'];
$empty = '';
if($wyslij)
{
if (empty($haslo))
{
$error = "Nie wpisałeś hasła<br/>";
$haslo = $empty;
}
elseif (strlen($haslo) != 5)
{
$error .="hasło musi mieć 5 znaków<br/>";
$haslo = $empty;
}
if (empty($error))
{
$error .= "Twoja głos został oddany";
}
}
else
{
$error .= "Wystąpił błąd podczas głosowania, spróbuj później.";
}
}
//TU MIAŁBY SIĘ WYŚWIETLAĆ ERROR
echo $error;
?>
</body>
</html>
zrobiłem tak, jednak nie działa do końca ;/
tu można zobaczyć jak to wygląda na stronie jak na razie:
http://p13.nsf.pl/sondaPHP/index.php
bardzo proszę o pomoc
RE: [PHP] sonda - bardzo skomplikowany problem - POMOCY ! ! ! - Pedro84 - 18-02-2012
Co nie działa?
RE: [PHP] sonda - bardzo skomplikowany problem - POMOCY ! ! ! - eremen - 18-02-2012
(18-02-2012, 19:39)Pedro84 napisał(a): Co nie działa?
Kod: <?php
// ustalenie szerokosci w pikselach,
// jesli plik graficzny ma 1 px szerokosci
$szerokosc=200;
//FUNKCJA LOSUJACA HASŁO
function GenRandom($howlong)
{
$chars = "abcdefghijklmnoprstuwxyzq";
$chars .= "1234567890";
$pass = "";
$len = strlen($chars) - 1;
for($i =0; $i < $howlong; $i++)
{
$random = rand(0, $len);
$output .= $chars[$random];
}
return $output;
};
$haslo = htmlspecialchars(trim($_POST['haslo']));
$kody = file('./kody.txt');
if($klucz = in_array($haslo, $kody))
{
unset($kody[$klucz]);
file_put_contents('./kody.txt', implode("\n", $kody));
}
function errory()
{
$glosuj = $_POST['glosuj'];
$haslo = htmlspecialchars(trim($_POST['haslo']));
if($glosuj)
{
if (empty($haslo))
{
$error = "Nie wpisałeś hasła<br/>";
}
elseif (strlen($haslo) !== 5)
{
$error .="hasło musi mieć 5 znaków<br/>";
}
if (empty($error))
{
$error .= "Twój głos został oddany";
}
else
{
$error .= "Wystąpił błąd podczas głosowania.";
}
}
return $error;
}
function prezentacja($szerokosc)
{
// odczyt pliku z pytaniem i odpowiedziami do tablicy $tresc
$tresc=explode("||",file_get_contents("tresc.php"));
// wyznaczenie liczby wierszy, ktora stanowia ilosc odpowiedzi plus pytanie
$ilosc=count($tresc);
// odczyt pliku z glosami
$glos=explode("||",file_get_contents("glosy.php"));
$suma=0;
for($c=0;$c<$ilosc;$c++)
$suma=$suma+$glos[$c];
echo '<p>'.$tresc[0];
for($c=1;$c<$ilosc;$c++)
{
echo '<BR />'.$tresc[$c];
$c--;
echo '<BR /> [ '.$glos[$c].' ] <BR />';
// graficzne wyswietlenie wynikow
for($i=0;$i<$glos[$c]/($suma+1)*$szerokosc;$i++)
echo '<img src="img.php" alt="">';
$c++;
}
echo '<BR /><BR />Suma głosów: '.$suma.'.</p>';
}
// jezeli wyslano dane z formularza
if ($wybor)
{
// odczyt pliku z pytaniem i odpowiedziami
$tresc=explode("||",file_get_contents("tresc.php"));
$ilosc=count($tresc);
// odczyt pliku z glosami
$glos=explode("||",file_get_contents("glosy.php"));
// uaktualnienie liczby glosow w pliku glosy.php
$fp=fopen("glosy.php","w");
// zwiekszenie o "1" odpowiedniego elementu tablicy, na ktory zaglosowano
$glos[$wybor-1]=$glos[$wybor-1]+1;
// zapis do pliku
fwrite($fp,implode("||",$glos));
fclose($fp);
}
// odczyt pliku z pytaniem i odpowiedziami
$tresc=explode("||",file_get_contents("tresc.php"));
$ilosc=count($tresc);
// odczyt pliku z glosami
$glos=explode("||",file_get_contents("glosy.php"));
/*POKAZUJE SONDE*/
echo '<p>'.$tresc[0].'<map glosuj="glosuj">
<form action="" method="post">
<table align="center" style="text-align:center;">
<tr>
<td>1.<img src="./zdjecia/auto1.jpg" alt="" glosuj="ramka"/></td>
<td>2.<img src="./zdjecia/auto2.jpg" alt="" glosuj="ramka"/></td>
<td>3.<img src="./zdjecia/auto3.jpg" alt="" glosuj="ramka"/></td>
<td>4.<img src="./zdjecia/auto4.jpg" alt="" glosuj="ramka"/></td>
<td>5.<img src="./zdjecia/auto5.jpg" alt="" glosuj="ramka"/></td>
</tr>
<tr>
<td>6.<img src="./zdjecia/auto6.jpg" alt="" glosuj="ramka"/></td>
<td>7.<img src="./zdjecia/auto7.jpg" alt="" glosuj="ramka"/></td>
<td>8.<img src="./zdjecia/auto8.jpg" alt="" glosuj="ramka"/></td>
<td>9.<img src="./zdjecia/auto9.jpg" alt="" glosuj="ramka"/></td>
<td>10.<img src="./zdjecia/auto10.jpg" alt="" glosuj="ramka"/></td>
</tr>
</table>
<div>
<input type="radio" name="wybor" value="1" /> nr 1.
<input type="radio" name="wybor" value="2" /> nr 2.
<input type="radio" name="wybor" value="3" /> nr 3.
<input type="radio" name="wybor" value="4" /> nr 4.
<input type="radio" name="wybor" value="5" /> nr 5.
<input type="radio" name="wybor" value="6" /> nr 6.
<input type="radio" name="wybor" value="7" /> nr 7.
<input type="radio" name="wybor" value="8" /> nr 8.
<input type="radio" name="wybor" value="9" /> nr 9.
<input type="radio" name="wybor" value="10" /> nr 10.
</div>
<p></p><div><br/>Wpisz hasło:';echo GenRandom(5);
echo '<br/><input type="text" name="haslo" /><input type="submit" name="glosuj" value="Głosuj" /><br/><br/></form></map></p>'; echo errory();
/*POKAZUJE WYNIKI*/
echo prezentacja($szerokosc);
?>
aktualny kod wygląda tak, trochę nad nim posiedziałem.
sprawdź tutaj jak działa : http://p13.nsf.pl/sondaPHP/index.php
sprawdziłeś? Jak na razie chciałbym aby to generowane hasło(pod obrazkami aut) było związane z polem do wpisywania tekstu i głosowanie byłoby możliwe jedynie po wpisaniu powyższego hasła.
Jak na razie nie ważne czy wpiszę jakiekolwiek hasło, czy nie wpiszę hasła w ogóle ale jeśli zaznaczę jakieś 'radio' głos zostaje doliczany... chciałbym to zmienić - to mój główny cel puki co
RE: [PHP] sonda - bardzo skomplikowany problem - POMOCY ! ! ! - Pedro84 - 18-02-2012
Dobra, jedziemy:
1. kod jest obowiązkowy, więc musisz sprawdzać czy został wysłany - determinuje to w ogóle przejście dalej
2. jeśli masz kod, to wyszukujesz go sobie w tablicy: jest zły - wywalasz error, jest dobry - jedziesz dalej i usuwasz go z tablicy
3. jeśli krok 2 zwraca Ci true, no to standardowe zapisywanie głosowania.
Naprawdę, nie wiem gdzie to skomplikowanie w tym pytaniu.
Co do Twojego kodu:
1. zrób sobie normalną walidację - jakąś klasę albo funkcję
2. czemu nie przechowujesz głosowania w jakiś normalny sposób? (tablica, zserializowany obiekt)
3. można nawet dodać głos bez wybrania zdjęcia (powiązane z punktem 1)
RE: [PHP] sonda - bardzo skomplikowany problem - POMOCY ! ! ! - eremen - 18-02-2012
Dzięki za rady postaram się wprowadzić je w życie.
Co do Twoich wątpliwości w skomplikowanie tego zadania to zależy od subiektywnej oceny - wiem że mój poziom znajomości php nie jest najlepszy, jednak muszę lecieć z zadaniami dalej.
Sposób przechowywania głosowania jest taki, ponieważ kierowałem się jakimś kodem z internetu jako wzorcem, inaczej nie byłbym nawet w tym momencie w którym jestem.
RE: [PHP] sonda - bardzo skomplikowany problem - POMOCY ! ! ! - jakub1969 - 21-02-2012
nie analizowałem kodu, ale dlaczego cyfry nie sa w jednej lini bylo by latwiej je przekopiować. moze jakiś skrypt przepisz kod z obrazka? jest ich kilka i działają bardzo sprawnie sam na stronie taki używam. i tak jak pisze Pedro 3 PUNKTY i wszystko działa
hmm... ja bym zrobił że kilkam na zdjęcie a w osobnym oknie wyświetla sie kod do przepisania bylo by szybciej i sprawniej i estetyczniej itd
RE: [PHP] sonda - bardzo skomplikowany problem - POMOCY ! ! ! - eremen - 21-02-2012
te kody mają być tylko w pliku i nie muszą się pokazywać użytkownikowi. Zresztą, porzuciłem już ten kod bo nie potrafiłem tego zrobić i zacząłem wszystko od początku.
Kod: <?php
//GENEROWANIE KODU 5-CYFROWEGO
for ($s=0; $s<50; $s++){
srand((double)microtime()*1000000);
$kod=md5(uniqid(rand()));
// obliczamy ilość znaków w tekscie
$licz = strlen($kod);
// 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
$txt = substr($kod,0,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
if(isset($_POST['haslo']) && in_array($_POST['haslo'], $kody, true) && $_POST['glosuj']){
//ZAPISYWANIE WYNIKOW DO PLIKOW
if(isset($_POST['auto1']) && $_POST['auto1'] != ''){
$filename1 = $_POST['auto1'] . '.txt';
$auto1 = file_get_contents($filename1);
$auto1++;
$fileHandler=fopen("auto1.txt","w");
fputs($fileHandler,$auto1);
fclose($fileHandler);
}
elseif(isset($_POST['auto2']) && $_POST['auto2'] != ''){
$filename2 = $_POST['auto2'] . '.txt';
$auto2 = file_get_contents($filename2);
$auto2++;
$fileHandler=fopen("auto2.txt","w");
fputs($fileHandler,$auto2);
fclose($fileHandler);
}
elseif(isset($_POST['auto3']) && $_POST['auto3'] != ''){
$filename3 = $_POST['auto3'] . '.txt';
$auto3=file_get_contents("auto3.txt");
$auto3++;
$fileHandler=fopen("auto3.txt","w");
fputs($fileHandler,$auto3);
fclose($fileHandler);
}
elseif(isset($_POST['auto4']) && $_POST['auto4'] != ''){
$filename4 = $_POST['auto4'] . '.txt';
$auto4=file_get_contents("auto4.txt");
$auto4++;
$fileHandler=fopen("auto4.txt","w");
fputs($fileHandler,$auto4);
fclose($fileHandler);
}
elseif(isset($_POST['auto5']) && $_POST['auto5'] != ''){
$filename5 = $_POST['auto5'] . '.txt';
$auto5=file_get_contents("auto5.txt");
$auto5++;
$fileHandler=fopen("auto5.txt","w");
fputs($fileHandler,$auto5);
fclose($fileHandler);
}
elseif(isset($_POST['auto6']) && $_POST['auto6'] != ''){
$filename6 = $_POST['auto6'] . '.txt';
$auto6=file_get_contents("auto6.txt");
$auto6++;
$fileHandler=fopen("auto6.txt","w");
fputs($fileHandler,$auto6);
fclose($fileHandler);
}
elseif(isset($_POST['auto7']) && $_POST['auto7'] != ''){
$filename7 = $_POST['auto7'] . '.txt';
$auto7=file_get_contents("auto7.txt");
$auto7++;
$fileHandler=fopen("auto7.txt","w");
fputs($fileHandler,$auto7);
fclose($fileHandler);
}
elseif(isset($_POST['auto8']) && $_POST['auto8'] != ''){
$filename8 = $_POST['auto8'] . '.txt';
$auto8=file_get_contents("auto8.txt");
$auto8++;
$fileHandler=fopen("auto8.txt","w");
fputs($fileHandler,$auto8);
fclose($fileHandler);
}
elseif(isset($_POST['auto9']) && $_POST['auto9'] != ''){
$filename9 = $_POST['auto9'] . '.txt';
$auto9=file_get_contents("auto9.txt");
$auto9++;
$fileHandler=fopen("auto9.txt","w");
fputs($fileHandler,$auto9);
fclose($fileHandler);
}
elseif(isset($_POST['auto10']) && $_POST['auto10'] != ''){
$filename10 = $_POST['auto10'] . '.txt';
$auto10=file_get_contents("auto10.txt");
$auto10++;
$fileHandler=fopen("auto10.txt","w");
fputs($fileHandler,$auto10);
fclose($fileHandler);
}
$error = "dziękujemy za oddanie głosu";
}
elseif($_POST['glosuj']){
$error = "wpisałeś złe hasło lub nie wpisałeś wcale";
}
//------------------------------------------------------------------
/*POKAZUJE SONDE*/
echo '<p><map glosuj="glosuj">
<form action="" method="post">
<table align="center" style="text-align:center;">
<tr>
<td>1.<img src="./zdjecia/auto1.jpg" alt="" /></td>
<td>2.<img src="./zdjecia/auto2.jpg" alt="" /></td>
<td>3.<img src="./zdjecia/auto3.jpg" alt="" /></td>
<td>4.<img src="./zdjecia/auto4.jpg" alt="" /></td>
<td>5.<img src="./zdjecia/auto5.jpg" alt="" /></td>
</tr>
<tr>
<td>6.<img src="./zdjecia/auto6.jpg" alt="" /></td>
<td>7.<img src="./zdjecia/auto7.jpg" alt="" /></td>
<td>8.<img src="./zdjecia/auto8.jpg" alt="" /></td>
<td>9.<img src="./zdjecia/auto9.jpg" alt="" /></td>
<td>10.<img src="./zdjecia/auto10.jpg" alt="" /></td>
</tr>
</table>
<div>
<input type="radio" name="auto" value="auto1" checked="checked"/> nr 1.
<input type="radio" name="auto" value="auto2" /> nr 2.
<input type="radio" name="auto" value="auto3" /> nr 3.
<input type="radio" name="auto" value="auto4" /> nr 4.
<input type="radio" name="auto" value="auto5" /> nr 5.
<input type="radio" name="auto" value="auto6" /> nr 6.
<input type="radio" name="auto" value="auto7" /> nr 7.
<input type="radio" name="auto" value="auto8" /> nr 8.
<input type="radio" name="auto" value="auto9" /> nr 9.
<input type="radio" name="auto" value="auto10" /> nr 10.
</div>
<p></p><div><br/> <input type="text" name="haslo"/><input type="submit" name="glosuj" value="głosuj" /><br/>';echo $error;'<br/></form></map></p>';
?>
obecnie mam coś takiego i mam problem z tym, że nie mogę wpisać nigdy poprawnego hasła w sondzie ponieważ uaktualnia się ona za każdym razem i jak klikam głosuj to kody już są zmienione na inne... tak mi się wydaje - chyba że problem leży w czymś innym, nie mam pojęcia.
|