NOVINKA! E-learningové kurzy umělé inteligence. Nyní AI za nejlepší ceny. Zjisti více:
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

Diskuze: cookie

V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
mat.masar
Člen
Avatar
mat.masar:29.10.2015 8:18

Ahoj, je tu nekde článek o cookies?

 
Odpovědět
29.10.2015 8:18
Avatar
Odpovídá na mat.masar
Michal Šmahel:29.10.2015 8:36

Není, ale v <a href="http://­php.net/manual/en/fe­atures.cookies­.php#116837">o­ficiální dokumentaci</a> to mají krásně popsané.

Editováno 29.10.2015 8:38
Nahoru Odpovědět
29.10.2015 8:36
Nejdůležitější je motivace, ovšem musí být doprovázena činy.
Avatar
mat.masar
Člen
Avatar
Odpovídá na Michal Šmahel
mat.masar:29.10.2015 9:18

Dobře, přečetl jsem si to, ale stejně nevím jak použít $_COOKIE do podmínky...
Mám to takhle, ale takhle to nefunguje... jak mám použít cookie do podmínky?

if ($_POST) && ($_COOKIE["nehlasoval"]) {

//vkládání do db

}

Edit: vytvoření cookie je takhle

setcookie("stavhlasu","nehlasoval",time()+60*60*24*30);
Editováno 29.10.2015 9:18
 
Nahoru Odpovědět
29.10.2015 9:18
Avatar
Jan Lupčík
Tvůrce
Avatar
Odpovídá na mat.masar
Jan Lupčík:29.10.2015 9:39

Podmínka se píše do jedné závorky. A ještě máš název cookie špatně - v tom vytvoření má název stavhlasu. Tudíž správně je to takto:

if ($_POST && $_COOKIE["stavhlasu"]) {
//vkládání do db
}

Btw. řešit cookie jako že nehlasoval není dobré řešení. Uživatel si může kdykoliv cookie změnit a pak může hlasovat třeba 100×. Lepší by bylo si vytvořit na to tabulku se záznamy a tam to řešit např. přes IP adresu.

Nahoru Odpovědět
29.10.2015 9:39
TruckersMP vývojář
Avatar
TomasGlawaty
Člen
Avatar
Odpovídá na mat.masar
TomasGlawaty:29.10.2015 9:47
if ($_POST)

??

pokud budeš ověřovat Cookie, tak asi nějak takhle:

if ((isset($_COOKIE["stavhlasu"])) && ($_COOKIE["stavhlasu"] === 'nehlasoval'))
{
        // do something
}
 
Nahoru Odpovědět
29.10.2015 9:47
Avatar
Jan Lupčík
Tvůrce
Avatar
Odpovídá na TomasGlawaty
Jan Lupčík:29.10.2015 9:55
if ($_POST)

??

pokud budeš ověřovat Cookie, tak asi nějak takhle:

Já si myslím, že to chápe dostatečně a že při odeslání formuláře kontroluje též, jestli již uživatel nehlasoval.

Nahoru Odpovědět
29.10.2015 9:55
TruckersMP vývojář
Avatar
mat.masar
Člen
Avatar
mat.masar:29.10.2015 9:59

Jan Lupčík Jo vím, to už mi říkalo spoustu lidí a sám jsem nad tím přemýšlel, ale je to jen pro třídní hlasování a navíc předpokládám že 80% lidí bude hlasovat ze školy a z tama je stejné ip mám dojem.

TomasGlawaty Může to být zkombinované takhle?

if ($_POST  &&  (isset($_COOKIE["stavhlasu"])) && ($_COOKIE["stavhlasu"] === 'nehlasoval'))
{
// něco
}

Ten post znamená, jestli odeslal formulář...

 
Nahoru Odpovědět
29.10.2015 9:59
Avatar
mat.masar
Člen
Avatar
Odpovídá na Jan Lupčík
mat.masar:29.10.2015 10:02

Jo o to se snažím, že zvolí jeden z radio inputů, odešle a já zkotroluju jestli už hlasoval a podle toho se rozhodne, jestli se hlas uloží nebo se vypíše hláška, že hlasoval...

 
Nahoru Odpovědět
29.10.2015 10:02
Avatar
TomasGlawaty
Člen
Avatar
Odpovídá na mat.masar
TomasGlawaty:29.10.2015 10:26

já bych asi nekontroloval jestli $_POST něco obsahuje, ale kontroloval bych spíše jestli byl formulář odeslán.

if ((isset($_POST['submit'])) && ten zbytek s COOKIE)

přičemž 'submit' je name tvého odesílacího tlačítka.
samo že bude fungovat i if ($_POST) ale kdyby jsi měl na stránce více formulářů, tak musíš nějak odlišit, co bylo odesláno.
:)

 
Nahoru Odpovědět
29.10.2015 10:26
Avatar
mat.masar
Člen
Avatar
Odpovídá na TomasGlawaty
mat.masar:29.10.2015 11:50

Tén kód vypadá takhle.. a chtěl jsem se zeptat proč máš u issetu 2 závorky? jakože (( isset......))? Jedna je z ifu ale ta druhá?

if ($_POST && isset($_COOKIE["stavhlasu"])) {
                $hlas = $_POST["hlasovani"];
        if (!empty($_POST["hlasovani"])){
        mysql_query("UPDATE tricka SET pocet = pocet + 1 WHERE hlaspro = '$hlas'");
                //if( mysql_affected_rows($spojeni) = 1)
                //echo "Hlas byl započítán";
        }
                else {
               echo "Klidně hlasuj :)";
        }
                }

a "formulář"

<form action="hlasovani.php" method="post">
        <input type="radio" name="hlasovani" value="1" id="odsazeniprvniho"> s.modrá-t.modrá
        <input type="radio" name="hlasovani" value="2" id="prvniinput"> t.modrá-s.modrá
        <input type="radio" name="hlasovani" value="3" id="druhyinput"> t.modrá-bílá
        <input type="submit" value="Hlasovat" class="odsazeni">
</form>
 
Nahoru Odpovědět
29.10.2015 11:50
Avatar
mat.masar
Člen
Avatar
Odpovídá na TomasGlawaty
mat.masar:29.10.2015 12:01

Funguje je to jak s tím co jsem psal já tak s tím co jsi psal ty.

if (isset($_POST["odeslat"])  && ($_COOKIE["stavhlasu"] === 'nehlasoval'))

tak i toto

if ($_POST  &&  (isset($_COOKIE["stavhlasu"])) && ($_COOKIE["stavhlasu"] === 'nehlasoval'))
{

Akorád nevím, proč když přidám do kódu else, tak se mi vypisuje hned při načtení stránky...

<?php
 //  výběr db a spojení s db
 $spojeni = mysql_connect("localhost", "root", "");
 mysql_select_db("hlasovani", $spojeni);

// kontrola unikátnosti hlasování
setcookie("stavhlasu","nehlasoval",time()+60*60*24*30);

// ověřování odeslání hlasu
 $hlas = "";
if (isset($_POST["odeslat"])  && ($_COOKIE["stavhlasu"] === 'nehlasoval')){
 //if ($_POST && isset($_COOKIE["stavhlasu"])) {
                $hlas = $_POST["hlasovani"];
        if (!empty($_POST["hlasovani"])){
        mysql_query("UPDATE tricka SET pocet = pocet + 1 WHERE hlaspro = '$hlas'");
                //if( mysql_affected_rows($spojeni) = 1)
                //echo "Hlas byl započítán";
        }
                else {
               echo "Klidně hlasuj :)";
        }
                }
                else
                        echo "Už jsi hlasoval";



?>

Umístěné to mám dobře ne?

 
Nahoru Odpovědět
29.10.2015 12:01
Avatar
TomasGlawaty
Člen
Avatar
Odpovídá na mat.masar
TomasGlawaty:29.10.2015 15:58

no řekl bych že by to mohlo být nějak takhle:

ve formuláři bude na odeslání input type submit s atributem name="submit"

<?php

// spojení s databází ....

if ( isset($_POST['submit']) ) // pokud byl formulář odeslán, tzn. přišel v POSTu klíč s názvem 'submit'
{

        if ( !isset($_COOKIE['stavhlasu']) ) // pokud není v poli $_COOKIE klíč 'stavhlasu', tzn. uživatel ještě nehlasoval.
        {

                $hlas = $_POST["hlasovani"]; // odeslaný hlas
                mysql_query('UPADATE ...'); // upadate v databázi

                setcookie('stavhlasu',TRUE, time()+60*60*24*30 ); // nastavíme do cookie klíč 'stavhlasu' na TRUE (nějak nazáleží no hodnotě - TRUE - , protože stejně jenom ověřujeme existenci klíče, né jeho hodnotu)

                echo 'Hlas byl úspěšně zapsán';

        }
        else
        {

                echo 'Již jste hlasoval';

        }

}

Píšu z hlavy, ale nějak takhle by to mohlo vypadat :)

Editováno 29.10.2015 15:58
 
Nahoru Odpovědět
29.10.2015 15:58
Avatar
mat.masar
Člen
Avatar
Odpovídá na TomasGlawaty
mat.masar:29.10.2015 18:29

Jo dobré, to tvoje vypadá mnohem přehledněji, akorád¨

else
        echo "Klidně hlasuj :)";

se vypisuje hned při príchodu na stránku, jak se dá udělat, aby se to vypsalo až po odeslání formuáře, ale prázdného?

 
Nahoru Odpovědět
29.10.2015 18:29
Avatar
Tonda Kozák
Člen
Avatar
Tonda Kozák:29.10.2015 23:37

Ukaž, jak vypadá tvůj současný kód.
Jinak je to nádherná ukázka nezabezpečeného kódu. Ideální pro SQL injection.

 
Nahoru Odpovědět
29.10.2015 23:37
Avatar
mat.masar
Člen
Avatar
Odpovídá na Tonda Kozák
mat.masar:30.10.2015 8:23

Díky, :) dalo mi to spoustu práce, aby to bylo nezabezpečené. A jak to může být příklad SQL injection? Žádný input pro vložení textu tam není a před GET se taky nic neposílá.

K problému

<?php
 //  výběr db a spojení s db
 $spojeni = mysql_connect("localhost", "root", "");
 mysql_select_db("hlasovani", $spojeni);


// ověřování odeslání hlasu
if ( isset($_POST['odeslat']) ) // pokud byl formulář odeslán, tzn. přišel v POSTu klíč s názvem 'odeslat'
{

        if ( !isset($_COOKIE['stavhlasu']) ) // pokud není v poli $_COOKIE klíč 'stavhlasu', tzn. uživatel ještě nehlasoval.
        {

                $hlas = $_POST["hlasovani"]; // odeslaný hlas
                mysql_query("UPDATE tricka SET pocet = pocet + 1 WHERE hlaspro = '$hlas'"); // upadate v databázi

                setcookie('stavhlasu',TRUE, time()+60*60*24*30 ); // nastavíme do cookie klíč 'stavhlasu' na TRUE (nějak nazáleží no hodnotě - TRUE - , protože stejně jenom ověřujeme existenci klíče, né jeho hodnotu)

                echo '<p id="vlozeno">Hlas byl úspěšně zapsán</p>';

        }
        else
        {

                echo '<p id="odhlasovano">Už jsi hlasoval</p>';

        }

}
else
        echo "Klidně hlasuj :)";
?>

Předpokládám, že stačí php kód..

 
Nahoru Odpovědět
30.10.2015 8:23
Avatar
TomasGlawaty
Člen
Avatar
Odpovídá na mat.masar
TomasGlawaty:30.10.2015 13:14

Ty chceš, aby se vypsalo 'klidně hlasuj', když nekdo odešle formulář, ale nezvolí žáden radiobutton ?

<?php
 //  výběr db a spojení s db
 $spojeni = mysql_connect("localhost", "root", "");
 mysql_select_db("hlasovani", $spojeni);


// ověřování odeslání hlasu
if ( isset($_POST['odeslat']) ) // pokud byl formulář odeslán, tzn. přišel v POSTu klíč s názvem 'odeslat'
{

        if ( !isset($_COOKIE['stavhlasu']) ) // pokud není v poli $_COOKIE klíč 'stavhlasu', tzn. uživatel ještě nehlasoval.
        {

                if (isset($_POST['hlasovani'])) // pokud uživatel zvolil nějaký radiobutton
                {

                        $hlas = $_POST["hlasovani"]; // odeslaný hlas
                        mysql_query("UPDATE tricka SET pocet = pocet + 1 WHERE hlaspro = '$hlas'"); // upadate v databázi

                        setcookie('stavhlasu',TRUE, time()+60*60*24*30 ); // nastavíme do cookie klíč 'stavhlasu' na TRUE (nějak nazáleží no hodnotě - TRUE - , protože stejně jenom ověřujeme existenci klíče, né jeho hodnotu)

                        echo '<p id="vlozeno">Hlas byl úspěšně zapsán</p>';

                }
                else
                {

                        echo 'Klidně hlasuj :)';

                }


        }
        else
        {

                echo '<p id="odhlasovano">Už jsi hlasoval</p>';

        }

}
else
        echo "Klidně hlasuj :)";
?>

Šlo by to zkrátit sloučneím podmínek, ale takhle je to pěkně vidět ... :)
Rád poadím, ale každopádně měl by jsi se na to trochu kouknout, protože tohle jsou naprosté základy, jak větvit program ...

 
Nahoru Odpovědět
30.10.2015 13:14
Avatar
Tonda Kozák
Člen
Avatar
Tonda Kozák:30.10.2015 17:05

Smaž tu poslední **else **větev.

A pokud používáš v databázovém dotazu nějakou hodnotu, kterou jsi dostal od uživatele, vždy ji musíš escapovat - funkce mysql_real_es­cape_string()

$hlas = mysql_real_escape_string($_POST["hlasovani"]); // odeslaný hlas, nyní nově bezpečně.
 
Nahoru Odpovědět
30.10.2015 17:05
Avatar
mat.masar
Člen
Avatar
Odpovídá na Tonda Kozák
mat.masar:30.10.2015 17:09

Dobře, chápu, že se to tak má dělat, ale v tomhle případě jde o radio inputy(do $hlas přijde bud 1,2 nebo 3)
Jak chceš toto podvrhnout?

 
Nahoru Odpovědět
30.10.2015 17:09
Avatar
Tonda Kozák
Člen
Avatar
Tonda Kozák:30.10.2015 17:38

Není to tak těžké:
http://www.tondakozak.cz/…ena-post.gif

 
Nahoru Odpovědět
30.10.2015 17:38
Avatar
mat.masar
Člen
Avatar
Odpovídá na Tonda Kozák
mat.masar:30.10.2015 17:42

Aha to jsem nevedel ze to jde..Tos dělal ty?

 
Nahoru Odpovědět
30.10.2015 17:42
Avatar
Tonda Kozák
Člen
Avatar
Tonda Kozák:30.10.2015 17:43

Jo. Dělal.
Nikdy, v žádném případě nevěř tomu, co ti přijde od uživatele!

 
Nahoru Odpovědět
30.10.2015 17:43
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 21 zpráv z 21.