Autor Zpráva
TechniX
Profil
Ahoj, už velkou dobu se peru kde najít anketu, která by mi fungovala správně .. Potřeboval bych anketu, kde člověk klikne a udělá to zápočet a už nemůže kliknout znova. Také aby to bylo bez Mysql.

Na internetu jsem toho prošel už mnoho, vše vyzkoušel a buď jsou v tom problémy že to vůbec nefunguje (přitom na hostingu kde mají PHP3 jim to jde :D) a nebo to funguje, ale může si na to člověk klikat do aleluja a ochrana která je tam udělaná nefunguje ....

Mám na hostingu PHP 5.3. Má někdo nějakou ověřenou anketu co běží bez problému ? Díky za pomoc.
johnl
Profil
TechniX:
100% zaručená ochrana proti hlasování víckrát z jednoho PC nebude nikdy 100%. SESSION smažu, COOKIES smažu...
Úplně nejlepší by bylo asi hlasování jen pro přihlášené uživatele kteří by museli mít nějakým způsobem ověření účet. Eventuální možností je omezení pro IP (na to by mi pomohlo asi jen obcházet s mobilem veřejné wifi sítě). Chceš z toho vynechat mysql, to by Ti sice ušetřilo práci, ale pokud se rozhodneš pro omezení na IP dá se to ještě eventuálně vyřešit zápisem do souboru, kde budeš mít soubor např. hlasovali.txt se strukturou:

192.168.1.1
192.168.1.2
192.168.1.3
...

A při pokusu o hlasování ověříš, jestli už není tato IP v tomto seznamu: načteš soubor do proměnné, tu rozdělíš pomocí explode() na řádky a pak jen ověříš pomocí in_array() jestli není IP na některém řádku (nebo jestli je i snašší způsob ověřit zda je v souboru daný řetězec tak tak).

Eventuálně by na to možná šla použít funkce strpos() a nemusel by jsi tak rozdělovat soubor ještě na pole. :o)
Kubo2_
Profil *
TechniX:
Alebo môžeš eventuálne prechádzať súbor hlasovali.txt po riadkoch až kým nenarazíš na ip aktuálneho používateľa alebo koniec súboru, napr. takto:
<?php
$hlasoval = false;
for($d = fopen("hlasovali.txt", 'r'), $row = null; $d && !feof($d); $row = str_replace("\n", '', fgets($d))) {
  if($row === $_SERVER['REMOTE_ADDR']) {
    $hlasoval = true;
    break;
  }
} 

if(!$hlasoval) {
  // užívateľ ešte nehlasoval
} else {
  // ...
}
TechniX
Profil
Super, jak to tak čtu zní to zajímavě :) Dejme tomu ta ochrana by byla super, ale teď jak to spářit ze základní anketou kde bude jen příklad rozvržení:

------------------------
Líbí se vám to ?

Ano (10) / Ne (5)
------------------------

z toho že se bude moct kliknout buď na text Ano nebo Ne.

Klidně budu rád i za jiné rozvržení, ale aby to opravdu fungovalo, už je to jediná věc co mi schází :(


Děkuji za pomoc! :)
anonymníí
Profil *
TechniX:
Jseš si vědom faktu, že když zahlasuje někdo z paneláku, že nikdo jiný hlasovat nebude moct? Že IP adresa není unikátní identifikátor? Že se dá během okamžiku změnit?
Alphard
Profil
anonymníí [#5]:
Hmm, to je hezké konstatování, co navrhujete? Cookies smažu, info o prohlížeči apod. změním, IP schovám za proxy. Rozumná úroveň zabezpečení se mi zdá něco ve stylu když je nastavená cookie nebo se z dané IP hlasovalo v poslední hodině, hlas odmítnu. Možno doplnit o pár dalších údajů z pole $_SERVER.

Kubo2 [#3]:
Co to vymýšlíš za přehledný cyklus? :-)
while (($row = fgets($d)) !== false)
{
  if (trim($row) == $_SERVER['REMOTE_ADDR']) ...
}

TechniX:
Anketu bych řešil přes 3 databázové tabulky, udělat ji přes soubory bude docela zábavné. Jestli váš hosting nemá databázi, raději ho změňte.
DarkMeni
Profil
Proč nechceš použít databázi?
Jestli máš velkou návštěvnost, a budeš to chtít řešit přes ukládání do souboru, tak tam může být problém s thread safe zápisem (nedávno se to tu řešilo) - že ve stejný okamžik kliknou na odkaz třeba dva uživatele a ty procesy se provedou paralelně, takže místo 2 hlasů se připočte jen jeden (nebo v horším případě se to vynuluje, to už sice nevim proč, ale v tom řešeným vlákně to tak bylo)

Jestli nemáš velkou návštěvnost, a šance, že by na odkaz ve stejnou chvíli kliklo víc lidí, je hodně moc malá, tak to asi nemusíš nějak moc řešit

Přes soubory by to šlo asi tak, že si vytvoříš třeba složku s názvem ankety, do ní dáš nějakej soubor s otázkou a možnými odpověďmi a pak třeba vytvoříš soubory 0.txt, 1.txt, 2.txt ... (nebo klidně bez přípony) podle počtu možných odpovědí, zapíšeš do nich nejdřív 0 a pak do nich můžeš ukládat počet kliknutí - třeba vytvoříš odkazy jako http://example.com/anketa.php?odpoved=2 a ve skriptu pak přečteš přes $_GET["odpoved"] na který odkaz někdo kliknul a pak do správnýho souboru přičteš 1
Nebo to můžeš mít v jednom souboru oddělený třeba mezerou nebo odřádkováním
TechniX
Profil
anonymníí:
e stejnou chvíli kliklo víc lidí, je ho

Jo to máš pravdu, koncovou IP může mít hodně lidí a znemožní to hlasovat dalším, to je fakt :-/


DarkMeni:


Ano nějaká návštěvnost tam bude, takže riziko že v tu danou chvíli na to kliknou 2 a více lidí se určitě stane. Děkuji za informaci, toto se jen tak člověk nedozví z těch článků kde jsou ukázky anket a podobně.

...

Tohle bude zřejmě oříšek, který nevyřeším nevím si už rady ..
DarkMeni
Profil
Pořád si nenapsal proč se vlastně chceš vyhnout databázi

Jinak řešit to nějak de, v tom vlákně kde se řešilo to vynulování jsou odkazy, kde je trochu vysvětlený proč to tak je a co se s tím dá dělat

Zajistit jednorázové hlasování je hodně složitý, COOKIES dou smazat - ale to neví každý, a pro ty, co se v psaní webu docela vyznaj, asi jen tak nějakou ochranu proti opakovanýmu hlasování neuděláš - možná tak tím, že dovolíš hlasovat jen přihlášeným uživatelům, ale registrovat se jen kvůli možnosti hlasovat v anketě může hodně lidí odradit

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: