-
Joomla! - erneutes Voten vermeiden
27.05.2010 in Joomla! von romox
- Zum Downloadmanager hinzufügen
- PDF-Datei herunterladen
- Arbeitsmaterialien herunterladen
- Kommentare ansehen (7)
- Kategorie: Joomla!
- Erstellt mit Programmversion: 1.5
- Dateigröße (PDF): 1.2 MB
- Dateigröße (Arbeitsmaterial): 3 KB
- Bisherige Zugriffe: 2343
Lieber Gast …
… die Inhalte von PSD-Tutorials.de stehen nur registrierten Mitgliedern zur Verfügung. Damit wollen wir den Communitygedanken weiterführen. Als Mitglied trägst du - wenn auch nur im Kleinen - zum Puls der Community bei. Und nur so ist es möglich, weiterhin hochwertige Inhalte für alle bereitzustellen.
Vorteile der kostenlosen Mitgliedschaft
Mit der kostenlosen und schnell erledigten Registrierung erhältst du viele nachhaltige Vorteile, die wir dir hier in aller Kürze aufzeigen möchten:
- PSD steht für professionelles Know-how in den Bereichen Bildbearbeitung mit Photoshop, Fotografie, Webentwicklung, Layout- und Vektorbearbeitung, 3D-Bearbeitung mit Cinema 4D und Co.
- Über 2200 Tutorials mit druckbarer PDF-Datei und teilweise den zugehörigen Arbeitsmaterialien
- Mehr als 500 Video-Trainings als Stream zur Direktanzeige und zum Download
- Abruf von über 1000 Downloads zu Photoshop-Presets, 3D-Modellen, Grußkarten, Texturen & Co
- Zugriff auf ein sehr aktives Forum mit Antworten im Minutentakt
- Deine Daten sind sicher. Sie werden nicht weitergegeben! Die Mitgliedschaft kann jederzeit und ohne Aufwand wieder gelöscht werden.
Reinschnuppern als Gast
Niemand kauft gerne die Katze im Sack, auch wenn sie kostenlos ist. Wir haben eine Handvoll Tutorials und Video-Trainings ausgesucht, die du auch als Gast ohne Registrierung ansehen kannst. Gefallen sie dir, stehen dir nach der Registrierung alle oben genannten Inhalte zur Verfügung.
- Download: Sepia-Vintage-Effekt-Aktion
- Download: Spiegelungen 2
- Download: Vektor-Logo (Eidechse)
- Tutorial: Linien zum Glühen bringen
- Tutorial: Ballons aus einer Schublade
- Tutorial: Neue Pinsel erstellen leicht gemacht
- Tutorial: Kommerzielle Fotografie 01: Berufswunsch Fotografie
- Videotraining: Die Programmoberfläche und der Arbeitsbereich von Adobe InDesign
- Videotraining: Lichtscheinkontureneffekt mit Animation
- Videotraining: CorelDRAW X6 Grundlagen - Hilfsmittel Freihand, 2-Punkt-Linie, Bezier, B-Spline, Polylinie, Stift, 3-Punkt-Kurve
- Videotraining: CorelDRAW X6 Grundlagen: Hilfsmittel Form - Heranziehen, Zurückweisen
Das Punktesystem
Einen winzigen Haken gibt es noch. Es gibt bei uns ein Punktesystem. Damit soll erreicht werden, dass Mitglieder sich aktiv in unserer Community beteiligen. Sobald du im Forum schreibst oder Tutorials kommentierst, bekommst du Punkte. Mit diesen Punkten kannst du wiederum Tutorials anschauen oder Downloads herunterladen. Mit der Registrierung bei PSD-Tutorials.de erhältst du ein Startguthaben von 100 Punkten, womit du schon ein gutes Stück weit kommst.
Joomla!-Training - für die aktuelle Version 2.5
Du willst deine eigene Website erstellen und administrieren?- 9 Stunden Video-Trainings zum beliebten CMS Joomla ab 2.5!
- 40 Praxis-Lektionen in Text/Bild als PDF (über 500 Seiten)
Jetzt informieren
Kommentare
Tutorial empfehlen
Anleitung (Bilder + Extras werden nur für Mitglieder eingeblendet)
Vor einigen Tagen wurde ich mit dem Problem konfrontiert, dass manche Besucher ihre Cookies löschen und erneut voten. Deshalb habe ich com_poll angepasst und nun ist das Problem beseitigt. Gerne möchte ich euch zeigen, wie das geht.
Joomla! speichert nicht jede einzelne Stimme; es wird lediglich die Anzahl der Stimmen gespeichert. Meine Überlegung war also, eine neue Tabelle zu erstellen, in der die Benutzer gespeichert werden, die bereits gevotet haben. Natürlich muss das Voten dazu nur für registrierte Benutzer zugänglich sein.
Neue Tabelle:
jos_polls_control mit den Feldern id, poll_data_id, user_id, ip, date, tries.SQL-Befehl für phpmyadmin:
CREATE TABLE IF NOT EXISTS `jos_polls_control` ( `id` smallint(5) NOT NULL AUTO_INCREMENT, `poll_data_id` smallint(5) NOT NULL, `user_id` smallint(5) NOT NULL, `ip` varchar(15) NOT NULL, `date` int(10) NOT NULL, `tries` smallint(5) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=2 ;
Und eine weitere Tabelle
jos_polls_attempt mit den Feldern id, poll_data_id, user_id, ip, date, um erneute Abstimmversuche zu speichern.CREATE TABLE IF NOT EXISTS `jos_polls_attempt` ( `id` smallint(5) NOT NULL AUTO_INCREMENT, `poll_data_id` smallint(5) NOT NULL, `user_id` smallint(5) NOT NULL, `ip` varchar(15) NOT NULL, `date` int(10) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=13 ;Jetzt müssen noch zwei Dateien angepasst werden:
components/com_poll/controller.php
<?php
/**
* @version $Id: controller.php 10869 2008-08-30 07:24:03Z willebil $
* @package Joomla
* @subpackage Polls
* @copyright Copyright (C) 2005 - 2008 Open Source Matters. All rights reserved.
* @license GNU/GPL, see LICENSE.php
* Joomla! is free software. This version may have been modified pursuant
* to the GNU General Public License, and as distributed it includes or
* is derivative of works licensed under the GNU General Public License or
* other free or open source software licenses.
* See COPYRIGHT.php for copyright notices and details.
*/
// no direct access
defined( '_JEXEC' ) or die( 'Restricted access' );
jimport('joomla.application.component.controller');
/**
* Static class to hold controller functions for the Poll component
*
* @static
* @package Joomla
* @subpackage Poll
* @since 1.5
*/
class PollController extends JController
{
/**
* Method to show the search view
*
* @access public
* @since 1.5
*/
function display()
{
JRequest::setVar('view','poll'); // force it to be the polls view
parent::display();
}
/**
* Add a vote to an option
*/
function vote()
{
global $mainframe;
// Check for request forgeries
JRequest::checkToken() or jexit( 'Invalid Token' );
$db =& JFactory::getDBO();
$poll_id = JRequest::getVar( 'id', 0, '', 'int' );
$option_id = JRequest::getVar( 'voteid', 0, 'post', 'int' );
$user_ip = $_SERVER['REMOTE_ADDR'];
$user =& JFactory::getUser();
$user_id = $user->id;
$poll =& JTable::getInstance('poll','Table');
if (!$poll->load( $poll_id ) || $poll->published != 1) {
JError::raiseWarning( 404, JText::_('ALERTNOTAUTH') );
return;
}
$cookieName = JUtility::getHash( $mainframe->getName() . 'poll' . $poll_id );
// ToDo - may be adding those information to the session?
$voted = JRequest::getVar( $cookieName, '0', 'COOKIE', 'INT');
if ($voted || !$option_id )
{
if($voted) {
$msg = JText::_('You already voted for this poll today!');
}
if(!$option_id){
$msg = JText::_('WARNSELECT');
}
}
else
{
setcookie( $cookieName, '1', time() + $poll->lag );
require_once(JPATH_COMPONENT.DS.'models'.DS.'poll.php');
$model = new PollModelPoll();
$query = 'SELECT COUNT(*) as count FROM'
. ' jos_polls_control join jos_poll_data on'
. ' jos_polls_control.poll_data_id = jos_poll_data.id WHERE'
. ' pollid = ' . (int) $poll_id
. ' AND'
. " user_id = '" . $user_id . "'"
;
$db->setQuery($query);
$result = $db->loadObject();
if($result->count>0){
$model->voteattempt( $poll_id, $option_id, $user_ip, $user_id);
$msg = JText::_( 'You already voted for this poll today!' );
} else {
$model->vote( $poll_id, $option_id, $user_ip, $user_id);
$msg = JText::_( 'Thanks for your vote!' );
}
}
// set Itemid id for links
$menu = &JSite::getMenu();
$items = $menu->getItems('link', 'index.php?option=com_poll&view=poll');
$itemid = isset($items[0]) ? '&Itemid='.$items[0]->id : '';
$this->setRedirect( JRoute::_('index.php?option=com_poll&id='. $poll_id.':'.$poll->alias.$itemid, false), $msg );
}
}
?>
Beschreibung dazu:
Diese Befehle speichern die IP-Adresse und die UserID in die entsprechenden Variablen:
$user_ip = $_SERVER['REMOTE_ADDR'];
$user =& JFactory::getUser();
$user_id = $user->id;
Hier findet eine Abfrage statt, ob der User schon gevotet hat und dann wird weiter entschieden, ob die Stimme nun gezählt oder in der Liste mit den doppelten Stimmen gespeichert wird. Hier werden auch die neuen Parameter (ip und id) den Funktionen übergeben.
$query = 'SELECT COUNT(*) as count FROM'
. ' jos_polls_control join jos_poll_data on'
. ' jos_polls_control.poll_data_id = jos_poll_data.id WHERE'
. ' pollid = ' . (int) $poll_id
. ' AND'
. " user_id = '" . $user_id . "'"
;
$db->setQuery($query);
$result = $db->loadObject();
if($result->count>0){
$model->voteattempt( $poll_id, $option_id, $user_ip, $user_id);
$msg = JText::_( 'You already voted for this poll today!' );
} else {
$model->vote( $poll_id, $option_id, $user_ip, $user_id);
$msg = JText::_( 'Thanks for your vote!' );
}
Jetzt kommt noch die Datei components/com_poll/models/poll.php; hier sind die Funktionen deklariert.
Einmal komplett:
<?php
/**
* @version $Id: poll.php 10752 2008-08-23 01:53:31Z eddieajau $
* @package Joomla
* @subpackage Polls
* @copyright Copyright (C) 2005 - 2008 Open Source Matters. All rights reserved.
* @license GNU/GPL, see LICENSE.php
* Joomla! is free software. This version may have been modified pursuant
* to the GNU General Public License, and as distributed it includes or
* is derivative of works licensed under the GNU General Public License or
* other free or open source software licenses.
* See COPYRIGHT.php for copyright notices and details.
*/
// Check to ensure this file is included in Joomla!
defined('_JEXEC') or die( 'Restricted access' );
jimport( 'joomla.application.component.model' );
/**
* @package Joomla
* @subpackage Polls
*/
class PollModelPoll extends JModel
{
/**
* Add vote
* @param int The id of the poll
* @param int The id of the option selected
*/
function vote( $poll_id, $option_id, $user_ip, $user_id )
{
$db = $this->getDBO();
$poll_id = (int) $poll_id;
$option_id = (int) $option_id;
$user_ip = $user_ip;
$user_id = (int) $user_id;
$query = 'INSERT INTO #__polls_control'
. ' SET poll_data_id = ' . (int) $option_id
. ", user_id = '" . $user_id . "'"
. ", ip = '" . $user_ip . "'"
. ', date = ' . time()
. ', tries = 1'
;
$db->setQuery( $query );
$db->query();
$query = 'UPDATE #__poll_data'
. ' SET hits = hits + 1'
. ' WHERE pollid = ' . (int) $poll_id
. ' AND id = ' . (int) $option_id
;
$db->setQuery( $query );
$db->query();
$query = 'UPDATE #__polls'
. ' SET voters = voters + 1'
. ' WHERE id = ' . (int) $poll_id
;
$db->setQuery( $query );
$db->query();
$date =& JFactory::getDate();
$query = 'INSERT INTO #__poll_date'
. ' SET date = ' . $db->Quote($date->toMySQL())
. ', vote_id = ' . (int) $option_id
. ', poll_id = ' . (int) $poll_id
;
$db->setQuery( $query );
$db->query();
}
function voteattempt( $poll_id, $option_id, $user_ip, $user_id )
{
$db = $this->getDBO();
$poll_id = (int) $poll_id;
$option_id = (int) $option_id;
$user_ip = $user_ip;
$user_id = (int) $user_id;
$query = 'UPDATE #__polls_control join #__poll_data on'
. ' #__polls_control.poll_data_id = #__poll_data.id'
. ' SET tries = tries + 1'
. ' WHERE'
. ' pollid = ' . (int) $poll_id
. ' AND'
. " user_id = '" . $user_id . "'"
;
$db->setQuery( $query );
$db->query();
$query = 'INSERT INTO #__polls_attempt'
. ' SET poll_data_id = ' . (int) $option_id
. ", user_id = '" . $user_id . "'"
. ", ip = '" . $user_ip . "'"
. ', date = ' . time()
;
$db->setQuery( $query );
$db->query();
}
}
Die "alte" Funktion vote() habe ich hier erweitert, damit die User-ID beim Voten mit der IP und der Zeit in der neuen Tabelle gespeichert wird. Und zusätzlich ist die neue Funktion voteattempt() hinzugekommen; diese fängt die doppelten Stimmen ab und speichert diese in der zweiten neuen Tabelle. Das Feld "tries" ist nicht wesentlich wichtig, nur für die Bequemlichkeit, sofort solche Votes in der Tabelle zu erkennen. Beim jedem neuen doppelten Vote erhöht sich die Zahl jeweils um eins.
Ich hoffe mal, das ist soweit klar; Livedemo gibt's diesmal nicht, da eigentlich unnötig.
-
Reklame
-
-
- Fotobüchern
- Umrandung um Textfeld
- Kanten glätten bei meinem Bild oder Vektor?
- After Effects Ram-Vorschau - Problem mit Cache (aktualisert nicht)
- blender render stürzt ständig ab
- jQuery - Größe von einem Frameset ändern?
- [CS5] "Löschen-Mitteilung"
- Zerissenes Foto
- Biete Programmierung Ihres PSD-Designs
- Fehler beim Platzieren von Bildern
- Zeilenumbruch CS4
- Gestaltung eines Logos
- Kaufberatung Drucker
- Dynamische Auswahlliste: Name und ID übergeben
- Adobe Encore - Probleme Schaltflächen Unterbild
- 2 Fotos mit unterschiedlichem Schlagschatten in einer Datei
- Copyright-Frage - öffentliche Veranstaltung
- Photoshop auf Mini Lappi
- Link auf Anker - Firefox Problem
- Auftrag: Individuelle Flash-Gallerie
-
-
Aktuelles Commag
Anzeige
-
Anzeige


User hat PSD-Tutorials.de verlassen
11.10.2010 - 22:29
super danke dass kann ich gut ebrauchen
topmanager
04.10.2010 - 15:02
schön und übersichtlich erklärt,
so verstehe ich das sogar
romox
29.05.2010 - 17:11
Ok, jetzt die versprochene Anpassung, um auch Leute auszuschließen, die sich von der selben IP mehrmals registrieren und dann abstimmen.
Wir ersetzen die Zeile 94 in controller.php
. " user_id = '" . $user_id . "'"
druch folgende:
. " (user_id = '" . $user_id . "' OR ip = '" . $user_ip . "')";
Vorher wurden User gezählt, die schon (in dieser Kategorie) abgestimmt haben. Jetzt werden User OR (soviel wie und/oder auf gut Deutsch) andere User mit der selben IP gezählt und falls Anzahl größer als 0 ist, wird die Stimme nicht gezählt. Klar, wir schließen damit Personen im selben Netzwerk und Personen, die später diese IP erhalten und nicht gestimmt haben aus. Leider musste ich dies aber in Kauf nehmen, da jemand versucht hat für eine bestimmte Option ganz oft zu stimmen und sich dafür auch jedes mal neu registriert hat. Wenn man jetzt noch die Verbindung trennt und eine neue IP vom Provider erhält, geht es trotzdem.
Weitere Überlegungen wären per JavaScript Systemparameter (Auflösung, Browser, Betriebssystem usw), Provider anhand der IP zu vergleichen und so versuchen den Angreifer zu bemerken. Oder auch Aktivierungscode per SMS zu verschicken. Das war allerdings aber zu viel Aufwand in diesem Fall.
romox
29.05.2010 - 13:14
Die Erfahrung hat gezeigt, dass das noch nicht reicht. Leider musste ich zusätzlich IP Abfrage einbauen. Ist zwar auch keine 100% Sicherheit, aber dennoch besser.
Den Code werde ich heute noch hier in den Kommentaren posten
metallica1990
29.05.2010 - 13:07
sehr hilfreich!
vielen dank!
fittererfamily
29.05.2010 - 00:22
hab ich zwar nicht angeschaut aber hat mit trotzdem 3 punkte abgezogen, vielleicht versehentlich draufgekommen.
ich kann mit dem thema leider nichts anfangen.
romox
12.10.2010 - 11:27
Zu kompliziert oder interessiert das Thema einfach nicht? :-)