Diskuze: cookie
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.
Člen
Zobrazeno 21 zpráv z 21.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.
Není, ale v <a href="http://php.net/manual/en/features.cookies.php#116837">oficiální dokumentaci</a> to mají krásně popsané.
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);
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.
if ($_POST)
??
pokud budeš ověřovat Cookie, tak asi nějak takhle:
if ((isset($_COOKIE["stavhlasu"])) && ($_COOKIE["stavhlasu"] === 'nehlasoval'))
{
// do something
}
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.
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ář...
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...
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.
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>
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?
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
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?
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.
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..
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 ...
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_escape_string()
$hlas = mysql_real_escape_string($_POST["hlasovani"]); // odeslaný hlas, nyní nově bezpečně.
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?
Není to tak těžké:
http://www.tondakozak.cz/…ena-post.gif
Jo. Dělal.
Nikdy, v žádném případě nevěř tomu, co ti přijde od uživatele!
Zobrazeno 21 zpráv z 21.