Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP]Prosta ankieta
michat34
post 10.08.2012, 15:09:41
Post #1





Grupa: Zarejestrowani
Postów: 200
Pomógł: 1
Dołączył: 4.08.2012

Ostrzeżenie: (10%)
X----


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

Ten post edytował michat34 10.08.2012, 19:59:20
Go to the top of the page
+Quote Post
greycoffey
post 10.08.2012, 15:33:29
Post #2





Grupa: Zarejestrowani
Postów: 320
Pomógł: 29
Dołączył: 3.04.2010

Ostrzeżenie: (20%)
X----


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'.

Ten post edytował greycoffey 10.08.2012, 15:33:39
Go to the top of the page
+Quote Post
michat34
post 10.08.2012, 19:58:58
Post #3





Grupa: Zarejestrowani
Postów: 200
Pomógł: 1
Dołączył: 4.08.2012

Ostrzeżenie: (10%)
X----


ok dziekuje Ci za zwrocenie uwagi na klamry. a co do tablicy to czy te zmienne nie beda sie zerowac przy kazdym wczytaniu strony?
Go to the top of the page
+Quote Post
greycoffey
post 10.08.2012, 20:09:08
Post #4





Grupa: Zarejestrowani
Postów: 320
Pomógł: 29
Dołączył: 3.04.2010

Ostrzeżenie: (20%)
X----


Tak. Najprościej samemu sprawdzić wink.gif
Go to the top of the page
+Quote Post
michat34
post 10.08.2012, 20:23:13
Post #5





Grupa: Zarejestrowani
Postów: 200
Pomógł: 1
Dołączył: 4.08.2012

Ostrzeżenie: (10%)
X----


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



Go to the top of the page
+Quote Post
greycoffey
post 10.08.2012, 20:24:36
Post #6





Grupa: Zarejestrowani
Postów: 320
Pomógł: 29
Dołączył: 3.04.2010

Ostrzeżenie: (20%)
X----


Popatrz, jak ja zdefiniowałem tablicę, do tego musisz jakoś ją przekazać do funkcji, słowa-klucze: global, przekazywanie przez referencję.
Go to the top of the page
+Quote Post
michat34
post 10.08.2012, 20:28:00
Post #7





Grupa: Zarejestrowani
Postów: 200
Pomógł: 1
Dołączył: 4.08.2012

Ostrzeżenie: (10%)
X----


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
Go to the top of the page
+Quote Post
redeemer
post 10.08.2012, 20:31:38
Post #8





Grupa: Zarejestrowani
Postów: 915
Pomógł: 210
Dołączył: 8.09.2009
Skąd: Tomaszów Lubelski/Wrocław

Ostrzeżenie: (0%)
-----


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.


--------------------
Go to the top of the page
+Quote Post
michat34
post 10.08.2012, 20:32:52
Post #9





Grupa: Zarejestrowani
Postów: 200
Pomógł: 1
Dołączył: 4.08.2012

Ostrzeżenie: (10%)
X----


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. ?>






Ten post edytował michat34 10.08.2012, 21:31:14
Go to the top of the page
+Quote Post
greycoffey
post 10.08.2012, 21:58:32
Post #10





Grupa: Zarejestrowani
Postów: 320
Pomógł: 29
Dołączył: 3.04.2010

Ostrzeżenie: (20%)
X----


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
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 18.04.2024 - 14:58