Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Prosta ankieta
Forum PHP.pl > Forum > Przedszkole
michat34
witam no wiec w php jestem poczatkujacy. w kursie online przerobilem ostatnio temat o ciasteczkach. po wchlonieciu troche teorii chcialem przetestowac jak to wyglada w praktyce wiec zrobilem ankiete. sklada sie ze strony w html i podstrony w php. tutaj skrypty:

<html>
Wybierz odpowiedz
<form action="ankieta.php" method="post" >
<input type="radio" name="wybor" value="1">A<br/>
<input type="radio" name="wybor" value="2">B<br/>
<input type="radio" name="wybor" value="3">C<br/>
<input type="submit" value="OK" /><br/>
</html>


oraz w php:

<?php
function oddaj_glos()
{
$wybor=$_POST['wybor'];
if ($wybor==1)
A++;
elseif ($wybor==2)
B++;
else
C++;
}

define("A",0);
define("B",0);
define("C",0);

if(isset($_COOKIES['glos_oddany']))
echo "Juz glosowales. Mozesz glosowac co 24h";
else
setcookie('glos_oddany','1',time()+3600*24);
oddaj_glos();

echo A;
echo B;
echo C;
?>


1. wyswietla mi blad Parse error: syntax error, unexpected T_INC in /users/michat34/www/ankieta.php on line 6. co moze byc jego przyczyna?

2. czy to jak zapisalem inkrementacje zmiennej jest poprawne? a jak nie to jak zapisywac inkremetacje stałej...

3. ...oraz jezeli jest jakis bardziej komfortowy sposob i bezpieczniejszy do przechowywania danych niz stałe to nie obrazilbym gdybyscie mi go podali. moze byc sama nazwa funkcji a ja juz sobie reszte wygugluje. jak pisalem jestem dopiero poczatkujacy

4. w instrukcji z if jezeli jest ciastko to wywali komunikat, nie zrobi funkcji i pokaze wyniki. jezel nie ma ciastka to zrobi funkcje i pokaze wyniki. czy to jest poprawnie zapisane? moze instrukcje po else powinem wziac w { i }?

pozdrawiam
greycoffey
Stała jest STAŁA - nie można jej zmienić. Do zmiennych wartości używa się zmiennych.

W tym wypadku najlepsza byłaby tablica:

  1. $opcje = array(
  2. '1' => 0,
  3. '2' => 0,
  4. '3' => 0
  5. );
  6.  
  7. ++$opcje['1']; // preinkrementacja - dodaje 1, następnie zwraca wartość
  8. $opcje['2']++; // postinkrementacja - zwraca wartość, następnei dodaje 1


oddaj_glos() w twoim kodzie jest ZAWSZE wywoływane, działa to tak:

  1. if ($zmienna === true)
  2. // ta instrukcja jest wykonywana jeśli $zmienna === true
  3. else
  4. // ta instrukcja wywoływana jest jeśli $zmienna !== true
  5. // ta instrukcja jest wywoływana zawsze
  6.  
  7. // ALE:
  8.  
  9. if ($zmienna === true) {
  10. // ta instrukcja jest wykonywana jeśli $zmienna === true
  11. } else {
  12. // ta instrukcja wywoływana jest jeśli $zmienna !== true
  13. // jak wyżej
  14. }


Ja preferuję tworzenie klamr w klauzulach if/else/elseif, nawet, gdy zawierają jedną instrukcję - wygląda czytelniej i łatwo coś dodać. Jeśli chcemy zapisywać te klauzule krótko, mamy 'ternary operator'.
michat34
ok dziekuje Ci za zwrocenie uwagi na klamry. a co do tablicy to czy te zmienne nie beda sie zerowac przy kazdym wczytaniu strony?
greycoffey
Tak. Najprościej samemu sprawdzić wink.gif
michat34
hm okej ale chyba cos pomieszałem, gdzie zrobilem bład?

<?php
function oddaj_glos()
{
$wybor=$_POST['wybor'];
if ($wybor==1)
++$opcje[1];
elseif ($wybor==2)
++$opcje[2];
else
++$opcje[3];
}

$opcje = array(
'1' = 0;
'2' = 0;
'3' = 0;
);

if(isset($_COOKIES['glos_oddany']))
{
echo "Juz glosowales. Mozesz glosowac co 24h";
}
else
{
setcookie('glos_oddany','1',time()+3600*24);
oddaj_glos();
}

echo "A = $opcje[1]";
echo "B = $opcje[2]";
echo "C = $opcje[3]";
?>


tresc bledu: Parse error: syntax error, unexpected '=', expecting ')' in /users/michat34/www/ankieta.php on line 14



greycoffey
Popatrz, jak ja zdefiniowałem tablicę, do tego musisz jakoś ją przekazać do funkcji, słowa-klucze: global, przekazywanie przez referencję.
michat34
fakt juz poprawilem tablice, myslalem ze pisales szybko na kolanie ale dzieki : P a co do slow kluczy to juz patrze co tam pisza w internetach
redeemer
Cytat(michat34 @ 10.08.2012, 21:28:00 ) *
myslalem ze pisales szybko na kolanie ale dzieki
Hahaha biggrin.gif Nie mogłem się powstrzymać.

@michat34: kod w postach umieszczaj w odpowiednich tagach (tak jak zrobił greycoffey), a nie dawaj boldem.
michat34
no co czasami sa tacy : D

ok poprawie sie ; )

EDIT:

czy dałem poprawnie te referencje? bo juz sie cos zmienilo, dodaje mi wartosc przy wybraniu opcji i pokazuje ale nadal 2 rzeczy nie chodza.

1. po oddaniu glosu moge oddac drugi, czyli dalej nie działa cookie.
2. po oddaniu glosu za A, pokazuje mi A = 1 B = 0 C = 0, ale gdy cofne sie i zaglosuje za B to pokaze A = 0 B = 1 C = 0. zapewne cos zle zrobilem z ta referencja

  1. <?php
  2. function oddaj_glos(&$opcje)
  3. {
  4. $wybor=$_POST['wybor'];
  5. if ($wybor==1)
  6. ++$opcje[1];
  7. elseif ($wybor==2)
  8. ++$opcje[2];
  9. else
  10. ++$opcje[3];
  11. }
  12.  
  13. $opcje = array(
  14. '1' => 0,
  15. '2' => 0,
  16. '3' => 0
  17. );
  18.  
  19. if(isset($_COOKIES['glos_oddany']))
  20. {
  21. echo "Juz glosowales. Mozesz glosowac co 24h";
  22. }
  23. else
  24. {
  25. setcookie('glos_oddany','1',time()+3600*24);
  26. oddaj_glos(&$opcje);
  27. }
  28.  
  29. echo "A = $opcje[1]";
  30. echo "B = $opcje[2]";
  31. echo "C = $opcje[3]";
  32. ?>




greycoffey
Te głosy nie są nigdzie zapisywane wink.gif Jako, że dziś mam przypływ dobroci:
Funkcja oddaj_glos nei ma w sumie sensu - sprawdzasz czy $wybor == 1, jesli tak, inkrementujesz $opcje[1] etc.
Wystarczyłoby ++$opcje[$wybor];

Tworzysz plik dane.txt, wpisujesz do niego w każdej linii ilość głosów, czyli na początek (mamy np. 4 opcje):

Kod
0
0
0
0


  1. <?php
  2. // wczytujemy zawartość pliku do tablicy - każdy w nowym wierszu (tablice są numerowane od 0)
  3. $glosy = file('dane.txt');
  4.  
  5. // jesli istnieje zmienna $_POST['glos']
  6. if (isset($_POST['glos'])) {
  7. // sprawdzamy czy cookie istnieje
  8. if (!isset($_COOKIE['glosoddany'])) {
  9. ++$glosy[$_POST['glos']]; // inkrementujemy ten wiersz, na ktory wskazuj (o tym pozniej, przy renderowaniu formularza
  10. file_put_contents('dane.txt', implode("\n", $glosy)); // zapisujemy w pliku nowa ilosc glosow
  11. setcookie('glosoddany', '1', time()+60*60*24);
  12. } else {
  13. echo "Już oddałeś głos!<br/>";
  14. }
  15.  
  16. //listujemy liczbe glosow
  17. foreach ($glosy as $wiersz=>$iloscGlosow) {
  18. echo "$wiersz => $iloscGlosow<br/>";
  19. }
  20. } else {
  21. // wyswietlamy formularz
  22. ?>
  23. <html>
  24. Wybierz odpowiedz
  25. <form action="?" method="post" >
  26. <?php foreach($glosy as $wiersz) { ?>
  27. <input type="radio" name="glos" value="<?=$wiersz?>"/><?=$wiersz?><br/>
  28. <?php } ?>
  29. <input type="submit" value="OK" /><br/>
  30. </html>
  31. <?php
  32. }
  33. ?>


Powinno działać, a jeśli nie albo tak, przeczytakj to anyway:
Włącz wyświetlanie błędów, oraz poziom raportawania na taki, aby wyświetlał E_NOTICE. Znajdziesz o tym dużo informacji w internecie. Chodzi o to, aby kod:
  1. <?php
  2. echo $nieistniejacaZmienna;
  3. ?>

Zwracał Ci błąd E_NOTICE, a nie wyświetlał pustą stronę.

Jeśli napiszesz kolejny post, a jednak nie będziesz miał włączonego raportowania E_NOTICE, Bóg zabije jednego kotka wink.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.