Avatar
mat.masar
Člen
Avatar
mat.masar:

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

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

Není, ale v oficiální dokumentaci 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 (ceskyDJ)
mat.masar:

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
IT Man
Redaktor
Avatar
Odpovídá na mat.masar
IT Man:

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  ±0 29.10.2015 9:39
Když nevíš jak dál, podá ti ruku někdo, od koho by jsi to nečekal. A tu šanci musíš přijmout!
Avatar
TomasGlawaty
Člen
Avatar
Odpovídá na mat.masar
TomasGlawaty:
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  +1 29.10.2015 9:47
Člověk může dosáhnout čeho si zamane. Jen musí chtít, případně něco obětovat ...
Avatar
IT Man
Redaktor
Avatar
Odpovídá na TomasGlawaty
IT Man:
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  -1 29.10.2015 9:55
Když nevíš jak dál, podá ti ruku někdo, od koho by jsi to nečekal. A tu šanci musíš přijmout!
Avatar
mat.masar
Člen
Avatar
mat.masar:

IT Man 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  +2 29.10.2015 9:59
Avatar
mat.masar
Člen
Avatar
Odpovídá na IT Man
mat.masar:

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:

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
Člověk může dosáhnout čeho si zamane. Jen musí chtít, případně něco obětovat ...
Avatar
mat.masar
Člen
Avatar
Odpovídá na TomasGlawaty
mat.masar:

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:

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:

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
Člověk může dosáhnout čeho si zamane. Jen musí chtít, případně něco obětovat ...
Avatar
mat.masar
Člen
Avatar
Odpovídá na TomasGlawaty
mat.masar:

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:

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:

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:

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
Člověk může dosáhnout čeho si zamane. Jen musí chtít, případně něco obětovat ...
Avatar
Tonda Kozák
Člen
Avatar
Tonda Kozák:

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:

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
 
Nahoru Odpovědět 30.10.2015 17:38
Avatar
mat.masar
Člen
Avatar
Odpovídá na Tonda Kozák
mat.masar:

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:

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

 
Nahoru Odpovědět  +1 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.