Autor Zpráva
MaxDJs
Profil *
Zdravím,

máme udělat anketu v PHP pomocí session. Bylo by možno mi poradit kostru jak to udělat? Nepotřebuji kompletní řešení. To už bych měl být schopnej udělat.


Děkuji za odpověď
Jozin
Profil
Taktéž zdravím,

jednoduše v HTML uděláš formulář. Ten odešleš a zpracuješ PHP-čkem... přičemž si uložíš do session uložíš id ankety a pokud chce hlasovat znovu, tak se to neodešle.

Stačí ti to tak?
ShiraNai7
Profil
Jozin:
přičemž si uložíš do session uložíš id ankety a pokud chce hlasovat znovu, tak se to neodešle.

Stačí smazat cookies a lze hlasovat znovu.
Jozin
Profil
ShiraNai7:
To ale není zadání. Řešil si snad někdy zadání do školy naprosto do důsledků? Mají prostě udělat anketu s session a hotovo :-D

EDIT: Teď mě tak napadlo, jestli nebude v zadání spíš, že se díky session má pamatovat kolikrát klepl na jakou volbu v anketě. MaxDJs jaké je přesné znění úkolu?
MaxDJs
Profil *
Jozin:
Máme textovej soubor kde jsou uloženy počty hlasů. Máme z nich načíst data do session a pak zobrazit anketu.

Napadlo mě že na jedný stránce bude button a po kliknutí na něj se pomocí php načtou data ze souboru do jednotlivých session proměnných podle odpovědí a zobrazil by se odkaz na novou anketu, kde by se už zobrazila samotná anketa. Lze to takhle udělat?

Díky za odpověď
Jozin
Profil
To je podle mě zbytečné... na začátku scriptu bych dal test, jestli již v session jsou data a pokud ne, tak tyto data načtu. A dále vykreslím anketu už s daty. Nemusím mít žádné tlačítka a vždy budu vykreslovat data ze session.

Snad sem ti to popsal tak, aby si to pochopil, kdyžtak ještě jednou:

1. načíst data ze souboru do session (pokud je soubor prázdný, nebo neobsahuje data do session načteš defaultní hodnoty - nejspíš nula)
2. načíst data ze session do templatu
3. vyhodnocení formuláře uložení do souboru případně i do session.
MaxDJs
Profil *
Nevidíte, kde tam mám chybu?? píše mi to chybu na 24 řádku.

<?php
include('funkce.php');
session_start();

$obsah_souboru = nactiDataAnkety('data.dat');
$hlasy = preg_split("/,/",$obsah_souboru);
$_SESSION["hlasy"] = $hlasy;
$_SESSION["celkem_hlasovalo"] = $_SESSION["hlasy"][0] + $_SESSION["hlasy"][1] +$_SESSION["hlasy"][2] +$_SESSION["hlasy"][3];
$moznosti = array("Ano","Ano,ale mohla by být lepší","Ne","Vůbec ne!");
$_SESSION["moznosti"] = $moznosti;
$sloupky = array("moznostA.png","moznostB.png","moznostC.png","moznostD.png");
$_SESSION["sloupky"] = $sloupky;

echo "<H1>Jak se vám líbí tato anketa??</H1>";
echo "<table border=\"1\">";
for ($i=0;$i<=3;$i++){
	if($_SESSION["celkem_hlasovalo"]!=0){
    $sirka=round((100*$_SESSION["hlasy"][$i])/$_SESSION["celkem_hlasovalo"]);
	}
  else  {
    $sirka=0;  
  }

echo "<tr><th>$_SESSION[\"moznosti\"][$i]</th><td width=\"100\"><img src=\"$_SESSION[\"sloupky\"][$i]\" height=\"10\" width=\"$sirka\" alt=\"$_SESSION[\"hlasy\"][$i] hlas/y/ů\" /></td><td>$sirka %</td></tr>";
}
echo "<tr><td colspan=\"3\">Celkem hlasovalo: $celkem_hlasovalo</td></tr>";
echo "</table>";
?>
okolojdouci
Profil *
Místo \" používej apostrof, je to přehlednější. A řetězce a proměnné spojuj tečkou a máš po problémech.
Jozin
Profil
Jak radí okolojdouci a navic ty naprosto zbytečně pokaždé načítáš do session. Session zůstane tak jako tak, takže místo neustálého načítání dej prostě prvně ověření session
<?php
session_start();

if(count($_SESSION['moznosti']) == 0) {
  include('funkce.php');
  $_SESSION = nactiDataAnkety(); //vrati array a tim naplni session
}
 $hlasy = $_SESSION['hlasy'];
 $moznosti = $_SESSION['moznosti'];
 //...
 //to už si doplníš

Jde o to, že tak jak to máš, zbytečně přehráváš session. Moje řešení uloží co je do session a až dojde na expiraci, tak se to načte znovu ze souboru. Možná bych někde dole dal odkaz (refresh), který bude mít href třeba "?refresh=1" a v php bude
<?php
//...
if($_GET['refresh'] == 1) session_destroy();
//...
MaxDJs
Profil *
Jozin:
A lze něják udělat, aby se nezobrazoval notice? Protože já když nám žádnou proměnnou v session tak mi to zobrazí notice s tím že nám definovaný index

Notice: Undefined index: moznosti in C:\wamp\www\anketa-session\index.php on line 3

Děkuji za odpověď
Jozin
Profil
Notice se dá vypnout v php.ini a nebo přímo na začátku scriptu dáš zobrazování chyb na jiné nastavení:
<?php
error_reporting(E_ALL ^ E_NOTICE);
error_reporting(E_ALL & ~E_NOTICE);

jeden z těch dvou bude správně, teď nevím, jestli je to stejný zápis jako v php.ini (to je druhý řádek), nebo to první... zkus to ;)
YoSarin
Profil
Jozin:
Obojí je (v tomhle případě) stejné - první je xor, druhé je & s negovanou hodnotou E_NOTICE:
1111 ^ 0100 = 1011
1111 & (~0100) = 1111 & 1011 = 1011

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0