kostenloser Webspace werbefrei: lima-city


SQL IP überprüfen

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    c143

    c143 hat kostenlosen Webspace.

    Hallo,
    Ich würde gerne in meiner Datenbank für eine ID nur einen Eintrag pro IP erlauben.

    <?php
    function inet_aton($ip){ //Wandelt das Format in Zahlen um, ohne die Punktetrennung
        $ip = trim($ip);
        if (filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6)) return 0;
        return sprintf("%u", ip2long($ip));  
    }
    
    
    $con = mysqli_connect("mysql.lima-city.de","","",""); //Verbindung
    
    $IP_check = mysql_query("SELECT `IP` 
                            FROM `poll_answer` 
                            WHERE `IP`= '".inet_aton($_SERVER['REMOTE_ADDR'])."' AND `poll_ID` = '".$_POST['id']."'"); 
    
    if (mysql_num_rows($IP_check) != 0){
    	echo 'Error: Du hast schon gevoted!';
    	die();
    }
    
    ?>


    Also $_POST['id'] ist pro Umfrage eine ID. Jeder Vote hat nen eigenen Eintrag mit IP und Antwort und die ID ist eingetragen. Sobald bei der ID schon ein Eintrag mit der IP ist, soll eine Errormeldung gesendet und das Script abgebrochen werden. Nur funktioniert das bei mir so nicht und gibt auch keinen Error.

    Beitrag zuletzt geändert: 14.1.2014 17:34:41 von c143
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. Erstens kann es nicht funktionieren, wenn du mit mysqli die Datenbankverbindung aufbaust und dann den query mit mysql versuchst.

    Musst dich schon für eins entscheiden.

    Eine Fehlermeldung erhälst du nicht, weil du auch nicht da nach gefragt hast. mysql_error() oder mysqli_error() gibt dir eine Fehlermeldung aus, es muss ja nur in deinem Script auftauchen.
  4. Autor dieses Themas

    c143

    c143 hat kostenlosen Webspace.

    all-in1 schrieb:
    Erstens kann es nicht funktionieren, wenn du mit mysqli die Datenbankverbindung aufbaust und dann den query mit mysql versuchst.

    Musst dich schon für eins entscheiden.

    Eine Fehlermeldung erhälst du nicht, weil du auch nicht da nach gefragt hast. mysql_error() oder mysqli_error() gibt dir eine Fehlermeldung aus, es muss ja nur in deinem Script auftauchen.


    Mein Fehler, sorry, hab das nun geändert. Mit error meinte ich einfach eine selbstgeschriebene Errormeldung für den Benutzer meiner Webseite. Sowas wie 'Deine IP hat schon einen Eintrag, du kannst nicht nochmal voten.'
    Einen Mysqli error wird mir nicht ausgegeben und das ganze funktioniert auch so noch nicht.
  5. schon mal versucht
    inet_aton($_SERVER['REMOTE_ADDR'])


    zuerst als Variable zu deklarieren und dann in die SQL-Anweisung zu packen?


    Könnte natürlich auch daran liegen:
    if (mysql_num_rows($IP_check) != 0){


    versuche doch mal größer gleich 1

    Beitrag zuletzt geändert: 14.1.2014 18:52:41 von all-in1
  6. Autor dieses Themas

    c143

    c143 hat kostenlosen Webspace.

    all-in1 schrieb:
    schon mal versucht
    inet_aton($_SERVER['REMOTE_ADDR'])


    zuerst als Variable zu deklarieren und dann in die SQL-Anweisung zu packen?


    Genau das gleiche mache ich aber so beim einfügen in die Tabelle, da klappt alles super, dann sollte es auch hier gehen, aber mach ich gleich mal, wobei ich bezweifle, dass es an dem liegen kann.
  7. Könnte natürlich auch daran liegen:
    if (mysql_num_rows($IP_check) != 0){



    versuche doch mal größer gleich 1
  8. Autor dieses Themas

    c143

    c143 hat kostenlosen Webspace.

    all-in1 schrieb:
    Könnte natürlich auch daran liegen:
    if (mysql_num_rows($IP_check) != 0){



    versuche doch mal größer gleich 1


    Funktioniert immer noch nicht. Ich hab mal den query in sql laufen lassen einfach noch mit count, ergibt 6 votes, stimmt auch so. Aber ich hätte gerne, dass es nur einmal geht und danach der Error kommt, sogar bei 6 kommt er noch nicht bei > 1.
  9. Ich weiss nun nicht ob du mysqli oder mysql nutzt, also entsprechend dann ändern:
    if (mysql_num_rows($IP_check)){
    	echo 'Error: Du hast schon gevoted!';
    	die();
    }


    So sollte das reichen, funktioniert so zumindest bei einer anderen Abfrage bei mir im CMS.
  10. Autor dieses Themas

    c143

    c143 hat kostenlosen Webspace.

    all-in1 schrieb:
    Ich weiss nun nicht ob du mysqli oder mysql nutzt, also entsprechend dann ändern:
    if (mysql_num_rows($IP_check)){
    	echo 'Error: Du hast schon gevoted!';
    	die();
    }


    So sollte das reichen, funktioniert so zumindest bei einer anderen Abfrage bei mir im CMS.


    Ich benutze mysqli. Es gibt mir wieder keinen Error aus, deshalb schick ich jetzt die 2 Votes die ich grad gemacht hab.

    https://dl.dropboxusercontent.com/u/23477673/Bildschirmfoto%202014-01-14%20um%2019.25.40.png

    Das sollte doch passen, oder?
  11. Was gibt dir denn mysqli_num_rows aus?

    Keine Ahnung, warum die Schleife nicht ausgeführt wird.
  12. Autor dieses Themas

    c143

    c143 hat kostenlosen Webspace.

    all-in1 schrieb:
    Was gibt dir denn mysqli_num_rows aus?

    Keine Ahnung, warum die Schleife nicht ausgeführt wird.


    Wow, jetzt wirds komisch. Gibt die poll_ID aus, in diesem Fall 166. Nochmal den query:
    $IP_check = mysqli_query("SELECT `IP` FROM `poll_answer` WHERE `IP`='".inet_aton($_SERVER['REMOTE_ADDR'])."' AND `poll_ID` = '".$_POST['id']."'");


    Edit: Hab ich das AND falsch angewendet?

    Beitrag zuletzt geändert: 14.1.2014 19:41:56 von c143
  13. Hast du schon 166 Einträge mir der selben IP für den gleichen poll?

    Num_rows sollte ja eigentlich nur die Treffer zählen. So sollte er ja in der Schleife landen, wenn num_rows 166 ist, also einen Wert zurück gibt.

    Mit dem AND hat es nichts zu tun.
  14. Autor dieses Themas

    c143

    c143 hat kostenlosen Webspace.

    all-in1 schrieb:
    Hast du schon 166 Einträge mir der selben IP für den gleichen poll?

    Num_rows sollte ja eigentlich nur die Treffer zählen. So sollte er ja in der Schleife landen, wenn num_rows 166 ist, also einen Wert zurück gibt.

    Mit dem AND hat es nichts zu tun.


    Nein, ich habe nicht mal 166 Einträge. Die ersten 20 hab ich gelöscht und bin bei der ID 55 in der Tabelle (wie im letzen Foto zu sehen) Die PollID (Verknüpfung zu anderer Tabelle) also ein ganz normaler Eintrag ist 166. Oder in PHP ausgedrückt $_POST['id'].
  15. Wie sieht denn nun dein Script aus?
  16. Autor dieses Themas

    c143

    c143 hat kostenlosen Webspace.

    all-in1 schrieb:
    Wie sieht denn nun dein Script aus?


    Das ganze so:

    <?php
    function inet_aton($ip){
        $ip = trim($ip);
        if (filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6)) return 0;
        return sprintf("%u", ip2long($ip));  
    }
    
    
    $con = mysqli_connect("mysql.lima-city.de","","","");
    
    $array = explode("-", $_POST['data']);
    
    
    
    
    //Der Teil den uns interessiert
    
    $IP_check = mysqli_query("SELECT `IP` FROM `poll_answer` WHERE `IP`='".inet_aton($_SERVER['REMOTE_ADDR'])."' AND `poll_ID` = '".$_POST['id']."'"); 
    
    if (mysqli_num_rows($IP_check)){
    	echo 'Error: Du hast schon gevoted!';
    	die();
    }
    
    //Der Teil den uns interessiert
    
    
    
    
    
    $option_query = 'INSERT INTO poll_answer (`poll_ID`, `IP`, `vote`) VALUES';
    
    for ($i = 1; $i < count($array); $i++){
        if($i != 1) $option_query .= ',';
        $option_query .= " (".$_POST['id'].", ".inet_aton($_SERVER['REMOTE_ADDR']).", ".$array[$i].")";
    }
    
    if(!mysqli_query($con,$option_query)) echo mysqli_error($con); //Zweiter Query mit erster ID und werte des Arrays
    
    echo $_POST['id'];
    mysqli_close($con);
    ?>
  17. Schau dir das Manual nochmal an. Dein Query stimmt nicht ganz.

    http://php.net/manual/de/mysqli-result.num-rows.php
  18. Autor dieses Themas

    c143

    c143 hat kostenlosen Webspace.

    all-in1 schrieb:
    Schau dir das Manual nochmal an. Dein Query stimmt nicht ganz.

    http://php.net/manual/de/mysqli-result.num-rows.php


    if ($IP_check = mysqli_query($con, "SELECT `IP` FROM `poll_answer` WHERE `IP`='".inet_aton($_SERVER['REMOTE_ADDR'])."' AND `poll_ID` = '".$_POST['id']."'")) {
        $row_cnt = mysqli_num_rows($IP_check);
        if($row_cnt > 1){
    	    echo 'Error: Du hast schon gevoted!';
    		die();
        }
        mysqli_free_result($IP_check);
    }


    Funktioniert, danke viel viel mal für die Hilfe und den Aufwand. :)
  19. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!