Zur Navigation

votingscript mit gleichzeitigem Mailversand

1 kaheti

Hallo
Ich verwende ein Script (freescript) um ein Voting MIT IP-Sperre zu veranstalten.
Das Script wird mittels eines Formulares via submit in Gang gesetzt.
Ich möchte das Script gerne erweitern und zwar soll zusätzlich eine Mail (an mich) versendet werden. Eine Mail mit zu versenden ist ansich nicht schwer ...allerdings sollte diese auch in die IP/Cockie Sperre mit einfliessen, was ich mangels php-kenntnisse selber nicht hinbekomme.
Die Mail (eigenständiges Mailscript per include eingebunden) wird bisher noch jedesmal trotz IP-Sperre mit Klick auf den Submit-Button abgeschickt ... und das soll sie nicht.
Das Script macht mit Klick auf einen Button einen grafischen Zähler um eine Zahl weiter. Zu sehen bei http://www.awardcafe.de/voting.php
Kann mir das irgendwer - wenn möglichst nicht allzu kompliziert - erklären?

Das Script:
<?PHP

require_once "vote_config.php";


$vote = new Vote($votevars);
#Ermitteln, ob Formulardaten gepostet wurden
if(!empty($_POST['vote'])) {
  #Wenn Postdaten den erforderlichen Werten entsprechen ((int) zwischen 0 und 11)
  if ( (int) $_POST['vote'] > 0 && (int) $_POST['vote'] < 11 ) {
    #überprüfen, ob Doppelpost
    $vote->getIP();
    $vote->checkDblVote($votevars);
    if ( (bool) $vote->dblvote === true) {#Wenn Doppelvote
      $vote->setTextausgabe("text_dblvote");
    } else { #wenn nicht Doppelpost
      #IP ermitteln, Cookie setzen und IP/VoteID/Zeit speichern, sowie den Vote speichern
      $vote->setCookie($votevars);
      $vote->saveToBlocklist($votevars);
      $vote->increaseVote();
      $vote->saveVote($votevars);
      $vote->setTextausgabe("text_thnx");
    }
  } else { #Postdaten entsprechen nicht den erforderlichen Werten
    die("Die Übermittelten Daten entsprechen nicht den Vorgaben. Benutzen Sie bitte den Zurückbutton Ihres
    Browser und bewerten Sie erneut.");
  }
}
$vote->setVotebox($votevars);
$ausgabe = $vote->votebox;
#######################################################################
#       Beginn Klasse Vote                                            #
#######################################################################
class Vote {
  protected $votelist;
  protected $savetime;
  protected $ip;
  protected $tempIP;
  protected $blocklist;
  protected $id_found;
  protected $case;
  protected $temp;

  function __construct($votevars) {
    #Variablen Setzen
    $this->votelist_id = ($_SERVER['REQUEST_URI']);
    $this->votelist_id = str_replace("{$_SERVER['SERVER_NAME']}///", "", $this->votelist_id);
    $this->votelist_id = str_replace("=", "_", $this->votelist_id);
    $this->votelist_id = str_replace(".", "_", $this->votelist_id);
    $this->votelist_id = str_replace("?", "_", $this->votelist_id);
    $this->votelist_count = 0;
    $this->votelist_value = 0;
    $this->textausgabe    = "text_stnd";
    #Vote Formular Template einlesen
    if (file_exists($votevars['votetemplate'])) {
      $this->votebox = file_get_contents($votevars['votetemplate']);
    } else {
      die("Datei {$votevars['votetemplate']} nicht gefunden.");
    }
    #Vote Daten einlesen, wenn vorhanden
    if (file_exists($votevars['votelist'])) {
     $votelist = file($votevars['votelist']);
    } else {
      die("Datei {$votevars['votelist']} nicht gefunden.");
    }
    #Wenn Vote Daten gespeichert, diese für aufgerufene Seite ausgeben, wenn vorhanden
    if (!empty($votelist)) {
      foreach($votelist as $k => $v) {
        $votelist[$k] = explode(" ++ ", $votelist[$k]);
        if ($this->votelist_id == $votelist[$k][0]) {
          $this->votelist_count = $votelist[$k][1];
          $this->votelist_value = $votelist[$k][2];
        }
        $votelist[$k] = implode(" ++ ", $votelist[$k]);
      }
      $this->votelist = $votelist;
    }
  } #ENDE Konstruktor

  function setCookie($votevars) {
    setcookie($this->votelist_id, "voted", time()+(60*60*$votevars['blocktime']), "/", ".{$_SERVER['SERVER_NAME']}");
  }
 
  function checkDblVote($votevars) {
    $this->dblvote = false;
    if($_COOKIE[$this->votelist_id] == "voted") { #Cookie für diesen Eintrag existiert->Doppelvote
      $this->dblvote = true;
      return;
    } else { #Cookie für diesen Eintrag existiert nicht->Blockliste einlesen
      if (!file_exists($votevars['blocklist'])) {
        die("Die Datendatei für die IP-Sperre: \"{$votevars['blocklist']}\" konnte nicht gefunden werden");
      } else {
        $this->blocklist = file($votevars['blocklist']);
        #Blockliste überprüfen->wenn Doppelpost dblvote=TRUE
        foreach ($this->blocklist as $k => $w) {
          #IP und ID vorhanden -> timestamp abgleichen
          if (stristr($this->blocklist[$k], $this->IP) && stristr($this->blocklist[$k], " {$this->votelist_id} " )) {
            $savetime = $this->blocklist[$k];
            $savetime = explode(" ++ ", $savetime);
            if (time() - $savetime[2] > 60*60*$votevars['blocktime']) {
              array_splice($this->blocklist, $k, 1);
            } else {
              $this->dblvote = true;
              break;
            }
          }
        }
      }
    }
  }

  function increaseVote() {
    $this->votelist_value = ($this->votelist_value*$this->votelist_count+$_POST['vote'])/($this->votelist_count+1);
    $this->votelist_count ++;
  }

  function getIP() {
    unset($ip);
    if ($_SERVER['HTTP_X_FORWARDED_FOR']) {
      $tempIP = explode(",", $_SERVER['HTTP_X_FORWARDED_FOR']);
      $ip = $tempIP[0];
    } else {
      if ($_SERVER['HTTP_CLIENT_IP']) {
        $ip = $_SERVER['HTTP_CLIENT_IP'];
      } else {
        $ip = $_SERVER['REMOTE_ADDR'];
      }
    }
    if (!empty($ip)) {
      $this->IP = ($ip);
    } else {
      $this->IP = ("0.0.0.0");
    }
  }

  function saveToBlocklist($votevars) {
    #Wenn Einträge vorhanden, säubern zu alter Einträge (doppelt hält besser ;) )
    $blocklist = array();
    foreach ($this->blocklist as $k => $w) {
      $w = trim($w);
      if (!empty($w)) {
        $blocklist[] = $w;
      }
    }
    if (!empty($blocklist)) {
      $temp = array();
      foreach ($blocklist as $k => $w) {
        $blocklist[$k] = explode(" ++ ", $blocklist[$k]);
        if (time() - $blocklist[$k][2] < 60*60*$votevars['blocktime']) {
          $temp[] = implode(" ++ ", $blocklist[$k]);
        }
      }
      $blocklist = $temp;
    }
    #Neue Daten anfügen
    $blocklist[] = $this->IP." ++ ".$this->votelist_id." ++ ".time();
    $blocklist = implode("\n", $blocklist);
    #Blockliste speichern
    $fp = fopen($votevars['blocklist'], "wb");
    flock($fp, LOCK_EX);
    fwrite($fp, $blocklist);
    flock($fp, LOCK_UN);
    fclose($fp);
  }

  function saveVote($votevars) {
    $id_found = false;
    #Datendatei öffnen
    if (!file_exists($votevars['votelist'])) {
      die("Die Datendatei für die Wertungsdaten: \"{$votevars['votelist']}\" konnte nicht gefunden werden");
    } else {
      $this->votelist = file($votevars['votelist']);
    }
    #Backup speichern?
    if (time() - filemtime($votevars['votelist'].".bak") > 60*60*$votevars['backuptime']) {
      if (!file_exists($votevars['votelist_bak'])) {
        die("Die Sicherungsdatei für die Wertungsdaten: \"{$votevars['votelist_bak']}\" konnte nicht gefunden werden");
      } else {
        $fp = fopen($votevars['votelist'].".bak", "wb");
        flock($fp, LOCK_EX);
        fwrite($fp, file_get_contents($votevars['votelist']));
        flock($fp, LOCK_UN);
        fclose($fp);
      }
    }
    #Zeile mit aktueller vote_ID suchen und neue Werte eintragen
    foreach ($this->votelist as $k => $w) {
      if (stristr($this->votelist[$k], "{$this->votelist_id} ")) {
        $this->votelist[$k] = explode(" ++ ", $this->votelist[$k]);
        $this->votelist[$k][1] = $this->votelist_count;
        $this->votelist[$k][2] = $this->votelist_value;
        $this->votelist[$k] = implode(" ++ ", $this->votelist[$k]);
        $id_found = true;
        break;
      }
    }
    if ( (bool) $id_found === false) {
      $this->votelist[] = trim($this->votelist_id)." ++ ".trim($this->votelist_count)." ++ ".trim($this->votelist_value);
    }
    $temp = array();
    foreach ($this->votelist as $k => $w) {
    $w = trim($w);
      if (!empty($w)) {
        $temp[] = $w;
      }
    }
    if (count($temp) >= 2) {
      sort($temp);
    }
    $this->votelist = $temp;
    $this->votelist = implode("\n", $this->votelist);
    #aktualisierte Datei speichern
    $fp = fopen($votevars['votelist'], "wb");
    flock($fp, LOCK_EX);
    fwrite($fp, $this->votelist);
    fclose($fp);
  }

  function setVotebox($votevars) {
    
    $this->votelist_value = sprintf("%.0f", $this->votelist_value);
    $this->votebox = str_replace("[%vote_value%]",     $this->votelist_value,    $this->votebox);
    $this->votebox = str_replace("[%vote_count%]",     $this->votelist_count,    $this->votebox);
    $this->votebox = str_replace("[%vote_text%]",      $votevars[$this->textausgabe],   $this->votebox);
  }

  function setTextausgabe($case) {
    $this->textausgabe = $case;
  }
} #ENDE Klasse Vote
?>

Die Konfiguration sieht so aus:
<?PHP
#Variablen für Voteskipt
$votevars = Array();
# Textausgaben für die Abstimmungsanzeige
#
# 'text_stnd' Der Standardtext in der Wertungsanzeige
$votevars['text_stnd']    = "Diese Homepage kann bewertet werden";
# 'text_thnx' Der Text nach erfolgreicher Wertung
$votevars['text_thnx']    = "Die Bewertung wurde registriert, vielen Dank.";
# 'text_dblvote' Der Text nach doppelter Wertung (Cookie oder IP zur Ermittlung)
$votevars['text_dblvote'] = "Sie haben diese Homepage bereits bewertet!";

# 'blocktime' gibt die Zeit in Stunden an, für die eine erneute Wertung
# verhindert werden soll. 24h Default
$votevars['blocktime']    = 0;
# 'backuptime' gibt die Zeit in Stunden an, nach der bei erneuter Wertung
# ein Backup der Bewertungsdaten erfolgen soll. Dabei wird der jeweilige
# Inhalt der Datendatei in die Sicherungsdatei kopiert
$votevars['backuptime']   = 0; #in Stunden

#Die Pfadangaben relativ zur Skriptdatei um-votefiles/um-vote_script.php5
#
# 'votetemplate' = Die Datei, die das Template für das Formular enthält
$votevars['votetemplate'] = "votefiles/vote_block.htm";
# 'votelist' = Die Datei, die die Abstimmungsdaten enthält
$votevars['votelist']     = "votefiles/votelist.dat";
# 'votelist_bak' = Die Sicherungsdateifür die Abstimmungsdatendatei
$votevars['votelist_bak'] = "votefiles/votelist.dat.bak";
# 'blocklist' = Diese Datei enthält die gespeicherten ID's und IP's um Doppelertungen zu verhindern
$votevars['blocklist']    = "votefiles/voteblock.dat";


?>

und das Formular schaut so aus;

<form action="" method="post" name="form1" id="form1" onSubmit="return pruefen()">
<fieldset>
<select style="display:none;" name="vote" id="vote">
<option value=" 1 vote"> </option>
</select>
<label for="Absender-mail" id="text">bitte eine gueltige eMail Adresse angeben</label>
<input class="input" type="text" name="Absender-mail" id="Absender-mail" value="">
<input class="send" id="form" type="submit" value="">
</fieldset>
</form>

onSubmit="return pruefen()" ist eine javascript was die Formularfeldeingabe überprüfen soll.

vielen Dank im Voraus

nette Grüsse

Kalle

15.10.2012 19:00

2 Jörg Kruse

Innerhalb dieses else Blocks solltest du die Mail versenden:

    } else { #wenn nicht Doppelpost
      #IP ermitteln, Cookie setzen und IP/VoteID/Zeit speichern, sowie den Vote speichern
      $vote->setCookie($votevars);
      $vote->saveToBlocklist($votevars);
      $vote->increaseVote();
      $vote->saveVote($votevars);
      $vote->setTextausgabe("text_thnx");
    } 

15.10.2012 19:45

3 kaheti

Danke schonmal...aber WIE setze ich das um ?

Meine php-Kenntnisse reichen grademal um so'n include Befehl zu realisieren .-)

Wäre schön wenn mir jemand "vormacht" wie's geht.

nette Grüsse

Kalle

15.10.2012 20:01

4 Jörg Kruse

In PHP gibt es hierzu die Funktion mail():

http://php.net/manual/de/function.mail.php

Eine einfache Mail:

    } else { #wenn nicht Doppelpost
      #IP ermitteln, Cookie setzen und IP/VoteID/Zeit speichern, sowie den Vote speichern
      $vote->setCookie($votevars);
      $vote->saveToBlocklist($votevars);
      $vote->increaseVote();
      $vote->saveVote($votevars);
      $vote->setTextausgabe("text_thnx");
      $empfaenger = 'kaheti@example.com';
      $betreff = 'Neuer Vote';
      $nachricht = 'Es wurde einmal gevotet';
      mail($empfaenger, $betreff, $nachricht);
    } 

15.10.2012 21:21

5 kaheti

WOW....super kompetent ! Funktioniert....(erstmal auf einer Testseite) vielen herzlichen Dank

Werde dieses Forum als kleines Dankeschön mal verlinken !!!

nette Grüsse

Kalle

15.10.2012 23:07

Beitrag schreiben (als Gast)

Die Antwort wird nach der Überprüfung durch einen Moderator freigeschaltet.





[BBCode-Hilfe]