Autor Zpráva
Rico
Profil
Ahoj, mám menší problém s antispamem, co jsem si napsal. Není jenom proti botům, spíše proti lidem...

Tohle je kód ( je trochu delší, protože pracuje s db a stylama ):
<?php
  $text = htmlspecialchars(@$_POST["text"]);
  $email = htmlspecialchars(@$_POST["email"]);
  $akce = @$_POST["formular"];
  $odpoved = @$_POST["napis_vysledek"];
  $soucet = @$_POST["soucet"];
  $cislo1 = rand(1, 9);
  $cislo2 = rand(1, 9);
?>

 <form action="index.php?p=03&amp;al=03" method="post" class="form">
  <label for="e_mail">E-mail:</label>
  <input name="email" type="text" id="e_mail" style="margin-right: 150px;" class="input" value="">
  <br />
  <label for="text" style="margin-right: 312px;">Vzkaz:</label>
  <br />
  <textarea name="text" wrap="off" cols="50" rows="5" class="textarea">
  </textarea>
  <br />
  <label for="odpoved"><?php echo "".$cislo1." + ".$cislo2." = "; ?></label>
  <input type="text" id="odpoved" name="napis_vysledek" class="number">
  <input type="hidden" value="<?php echo($cislo1 + $cislo2); ?>" name="soucet" class="input">
  <input type="hidden" value="antispam" name="formular" class="input">
  <input name="send" type="submit" style="margin-left: 208px;" value="Odeslat" class="button">
</form>

 <?php
  include "./config.php";
    mysql_connect ($host, $user, $pass);
    mysql_select_db ($db);
    mysql_query("SET NAMES 'utf8'");
?>

 <?php
    if ($akce=="")
    {
      echo "";
    }
    elseif ($akce!="" and $odpoved == $soucet)
    {
      if ($email=="")
        {
          echo  "
                <div class='error_warning'>
                Nezadal jste e-mail a proto nebyl vzkaz uložen. <br />
                  <div class='error_solution'>
                  Řešení problému:
                    <span>
                    Zadejte svůj e-mail.
                    </span>
                  </div>
                </div>
                ";
        }
      elseif ($email!="")
        {
          mysql_query("INSERT INTO `vzkaznik` (`datum`,`email`, `text`) VALUES (NOW(),'".mysql_real_escape_string($email)."','".mysql_real_escape_string($text)."')");
          echo  "
                <div class='error_successful'>
                Vzkaz byl uložen <br />
                </div>
                ";
          unset ($_POST["soucet"]);
        }
    }
    else  
    {
      echo  "
            <div class='error_failed'>
            Nesouhlasí antispamová odpověď <br />
              <div class='error_solution'>
              Řešení problému:
                <span>
                Zadejte ji správně :-)
                </span>
              </div>
            </div>
            ";
    }
?>

Problém je takový, že když správně vyplním formulář, odešlu ( z db se mi pak vzkaz vypíše pod formulářem ) a začnu stránku aktualizovat, tak se mi začne "spamovat" ten vzkaz, který jsem napsal. I přes to, že se změní proměnné, které v podmínce porovnávám.
Tak jsem to zkoušel při úspěšném přidáním, vynulovat.. Nejdříve takto $odpoved==""; pak přes unset, ale pořád stejný problém..

Už nevím co s tím dál, nechci žádné složité obrázkové antispamy, prostě jen takovýto jednoduchý součtový.

Předem díky
BuGeR
Profil
Ty vygenerované hodnoty sečteš totíž hned ve formuláři, a jakmile ho odešleš, a poté aktualizuješ tak se ti nové čísla nevygenerujou znovu, ale zůstanou stejná - z toho POST.
Po přidání řádku do databáze (v tvém kódu řádek 57) přesměruj uživatele (pomocí header()) znovu na stránku z formulářem.
Pokud to chceš mít i s tím textem "Vzkaz byl uložen", tak použij $_GET - přesměruješ uživatele znovu na formulář, a za adresu přidáš např. ?pridano=ano, a na formuláři pomocí isset() zkontroluješ zda ten GET existuje, pokud ano, vypíšeš text.
Mimochodem, to obcházení chyb přes zavináče je pěkná prasárna. Použij funkci isset().

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:

0