voting mit ip-Kontrolle

rernanded

Erfahrenes Mitglied
Moin,
folgendes php funktioniert nicht. Es werden keine Einträge (votings) eingetragen und es findet auch kein ip-Abgleich(d.h. bereits 1mal in den letzten 24 Std. gevotet) statt.
Das Script ist nicht von mir, ich soll nur mal wieder den Fehler finden. Leider klappt das aber nicht wie gewünscht.
Moni

DB-Tabellen-Struktur:
id int(11) AUTO_INCREMENT - PRIMARY
gid int(11)
ts timestamp ON UPDATE CURRENT_TIMESTAMP()
ip text utf8 general_ci
votedate datetime


PHP:
<form action="votingwithiptester.php" method="post">
<input name="gid" size="11" maxlength="11" type="text">
<input type="submit" value="vote">
</form>
<br />
<?php

error_reporting(E_ALL);

$gid = $_POST['gid'];
$ip = $_SERVER['REMOTE_ADDR'];
$firstvotedate = date('Y-m-d H:i:s');
include_once('serverconnection.php');
$dbc = mysqli_connect($servername, $username, $password, $dbname);
$q = " SELECT * FROM votingwithip WHERE gid = '$gid' ";
$r = mysqli_query($dbc, $q);

while ($row = mysqli_fetch_array($r)) {

    if ($row['ip'] !== $ip) { // If ip not exists, go ahead and vote.

        $q2 = " INSERT INTO votingwithip (gid, votedate, ip) VALUES ('$gid', '$firstvotedate', '$ip') ";
        $r2 = mysqli_query($dbc, $q2);
        if ($r2) {
                echo 'Thank you for voting.';
        } else {
            echo 'There is a problem with your vote.';
            }
}
elseif ($row['ip'] === $ip) {
    // If ip exists, check date of last time voting.

        // Define the two dates.
        $votedate = $row['votedate'];
        $now = date('Y-m-d H:i:s');
        // Calculate hours between the dates.
        $diff = round((strtotime($now) - strtotime($votedate)) / (60 * 60));
        // Create variable for when user can return.
        $return = '24' - $diff;

        if ($diff > '24') { // Allow to vote once every 24 hours.
            $q3 = " INSERT INTO votingwithip (gid, votedate, ip) VALUES ('$gid', '$now', '$ip') ";
            $r3 = mysqli_query($dbc, $q3);

            // Display outcome of insert query.
            if ($r3) {
                echo 'Thank you for voting, please come back in 24 hours to vote again!';
            } else {
                echo 'There is a problem with your vote:' . mysqli_error($dbc) . ' in reference to query ' . $q3;
            }
        } else {
            echo 'Sorry, you\'ve already voted in the past 24 hours, please come back again in ' . $return . ' hours.';
        }

    }

} // End of while loop.

mysqli_close($dbc);

exit();
?>
 
Zuletzt bearbeitet:
Ganz ehrlich? Schmeiß weg das Script.

Siehe Kommentare im Script:
PHP:
<?php
  error_reporting(E_ALL);
 
  // Sicherstellen, das Fehler auch ausgeben werden
  ini_set('display_errors', true);

  // Hier fehlt die Überprüfung, ob das Script vom Formular aufgerufen wird, also
  if (isset($_POST['gid']))
  {
     $gid = $_POST['gid'];
    
     // Vorsicht, $_SERVER['REMOTE_ADDR'] muss nicht zwingend gesetzt sein
     $ip = $_SERVER['REMOTE_ADDR'];
    
    
     // Das ist Quatsch, das soll die Datenbank selber regeln     
     // $firstvotedate = date('Y-m-d H:i:s');

     // Kurios, wenn hier die Verbindung erstellt wird
     include_once('serverconnection.php');
    
     // warum dann hier nochmal????     
     $dbc = mysqli_connect($servername, $username, $password, $dbname);
    
     // Never ever "Select *", führe die Spalten auf, die du haben willst
     // Außerdem kannst du hier zusätzlich die IP-Adresse als where-Bedingung eintragen,
     // Somit ersparst du dir die Schleife
     // Und niemals ungefiltert Daten, die von außen kommen, an die Datenbank schicken, siehe dazu mysqi_real_escape_string     
     $q = " SELECT * FROM votingwithip WHERE gid = '$gid' ";
    
     // Hier fehlt eine Überprüfung, ob es einen Fehler gibt.
     $r = mysqli_query($dbc, $q);


     // Wie erwähnt, die Schleife ist Quatsch und unnötig performancelastig
     while ($row = mysqli_fetch_array($r))
     {
        // Wenn die IP im Select verwendet wird, braucht man das nicht
        if ($row['ip'] !== $ip)
        {
           // Auch hier $gid ungefiltert
           // '$firstvotedate' kann durch now() ersetzt werden
           $q2 = " INSERT INTO votingwithip (gid, votedate, ip) VALUES ('$gid', '$firstvotedate', '$ip') ";
          
           $r2 = mysqli_query($dbc, $q2);
           if ($r2)
             echo 'Thank you for voting.';
           else
            // hier sollte während der Entwicklung mysqli_error aufgerufen werden
            echo 'There is a problem with your vote.';
      }
      // Wäre mit der IP im Select unnötig
      elseif ($row['ip'] === $ip)
      {
        // Define the two dates.
        $votedate = $row['votedate'];
        $now = date('Y-m-d H:i:s');
        // Calculate hours between the dates.
        $diff = round((strtotime($now) - strtotime($votedate)) / (60 * 60));
        // Create variable for when user can return.
        $return = '24' - $diff;

        if ($diff > '24')
        { // Allow to vote once every 24 hours.
            $q3 = " INSERT INTO votingwithip (gid, votedate, ip) VALUES ('$gid', '$now', '$ip') ";
            $r3 = mysqli_query($dbc, $q3);

            // Display outcome of insert query.
            if ($r3) {
                echo 'Thank you for voting, please come back in 24 hours to vote again!';
            } else {
                echo 'There is a problem with your vote:' . mysqli_error($dbc) . ' in reference to query ' . $q3;
            }
        }
        else
        {
            echo 'Sorry, you\'ve already voted in the past 24 hours, please come back again in ' . $return . ' hours.';
        }
     }
   } // End of while loop.
  }

  mysqli_close($dbc);

  exit();
?>

Da sind noch mehr kleinere Macken drin, aber das reicht ja schon mal. Und Variablennamen wie $r, $q, etc. sind einfach nur schlimm, bei längeren Scripts verlierst du ganz schnell die Übersicht.
 
Zurück