Ochrana proti dvojitým komentářům

The Zero, čtvrtek 15. 2. 2007 - 23:30

Netrvalo dlouho a přináším další změny. Některé prohlížeče totiž nemyslí na uživatele a nevarují při opakovaném odesílání stránky s POST daty (No flame ;)). Chtělo to nějak vyřešit.

Samozřejmě nejjednodušší řešení spočívá v oddělení skriptu, který zpracovává  komentáře, od zobrazení stránky, a přidat jen přesměrování. Něco jako je třeba v RS2. To se mi nelíbí.

Jak na to o trochu líp

Bude nás to stát 1 SQL dotaz, ale to snad nikoho netrápí. On není pomalý. :)

// Tady zpracujeme příchozí data. Nejdůležitější je proměnná $text.
// Kdo čekal, že obsahuje email autora článku, spletl se.
$query= 'SELECT msg FROM '.mysql::PREFIX.'blog_comm '.
'WHERE call="'.$db->escape($this->call).'" AND ip="'.$_SERVER['REMOTE_ADDR'].'" '.
'ORDER BY time DESC LIMIT 1';
$result=$db->query($query);
if(!$result->num_rows() || $result->fetch_object()->msg!=$text) {
// tady přidáme komentář
}

V čem to tedy spočívá? Podíváme se, jaký byl poslední komentář ke komentovanému článku ze stejné IP adresy. Mohl bych ještě pro jistotu kontrolovat jméno, abych získal jistotu, ale napsat identický text by byla sakra náhoda. No a o komentáře v podobě smajlíku :) stejně nestojím :).

Ještě chci dodat, že jsem se záměrně vyhnul nějakému řešení přes session, a to hned ze dvou důvodů. Za prvé by to komplikovalo komentování dvou článků zároveň (ne že se to bude nějak často dít) a za druhé by to nezabránilo obnovení po x hodinách, jako se to dneska stalo MzK. Session po pár minutách vyprší a lifetime zase měnit nechci.

Zařazeno do kategorií O blogu, PHP.

Předchozí: Osobní rekord

Následující: To muselo být znamení

Komentáře

1. MzK

16.02.2007 10:54:22

Za ten dvojpost ještě jednou promiň, úmysl to nebyl ale koukám, že to bylo k něčemu dobré - Vylepšení tvého RS :)

2. MiK

16.02.2007 12:31:53

[0] The Zero Co máš proti redirectu? Proč to dělat jednoduše, když to jde i s databází? O "user experience" ;) jsi neslyšel, co? Může být, že po odeslání komentáře budu na článku reloadovat a čekat na odpověď - ale to ne, to budu muset potvrzovat, zda chci, nebo nechci odesílat POST data. Fuj!
http://en.wikipedia.org/wiki/Post/Redirect/Get

3. MiK

16.02.2007 12:39:57

Jako heslo je to proto, že lze využít magic wand a odpověď se tak bude pamatovat. A další fuj. Já nechci žádný magic wang (sic) s pamětí, ale zato mě štve, že se mi při odeslání komentáře zcela zbytečně aktivuje Správce hesel s dotazem, zda uložit login a heslo. Fuj, fuj, třikrát fuj. :-P

A BTH: Nepřeváděj se Ti pregnantně smajlíky. ;-)

4. The Zero

16.02.2007 14:18:05

avatar[3] MiK a) zapni si JavaScript nebo b) "Nikdy se neptat na heslo" :-)

5. The Zero

16.02.2007 14:19:14

avatar[3] MiK [4] The Zero Aha, zrada, ono se to ptá i se zapnutým JS.
To je tak když IE stávkuje (něco se mu nelíbilo) a já něco opravim... :-/

6. The Zero

16.02.2007 16:16:13

avatarA BTH: Nepřeváděj se Ti pregnantně smajlíky. ;)
Už by měly.

7. MiK

16.02.2007 16:33:29

[3] MiK Bé je správně, pana Správce jsem hned umlčel, ale k uživatelům to vstřícné není. :(
[6] The Zero Vypadá to, tož ozkouším. :P

Přidat komentář

Jako heslo je to proto, že lze využít magic wand a odpověď se tak bude pamatovat.

Povolené tagy: b, i, q. Bez jakýchkoli atributů a řádně ukončené. URL se převádí automaticky.

Vyžadováno je pouze jméno (proto je zvýrazněné), text, kód (ten zadáváte jen s vypnutým JavaScriptem - jestli ho nevidíte, nemusíte se o něj starat. Poslední věc, kterou formulář vyžaduje, je stisknutí tlačítka Přidat.

* E-mail slouží především k načtení gravatarů. Zobrazovat se nebude.