• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Prüfen ob IP schon in Datenbank ist

maria1

Mitglied
Hallo,

ich arbeite derzeit an einem rating script.

Ich habe 4 dateien :

index.php
rating_form.php
rating_result.php
rating.php

im grunde sieht die index.php so aus

http://nopaste.info/4c1320c7a1.html

Ich hoffe ihr versteht anhand des codes in etwa wie ich das haben will ?
Nunja, nur leider habe ich kein glück mit dem select ..
Wie muss der denn lauten ? Mir ist klar das der obige falsch ist , hab schon so lange herumversucht :/
 
Wenn du eine Schleife willst, die alle Einträge liest, musst du auch ein while() drumrum machen, aber ich denke, da ist nur der Kommentar falsch, weil du effektiv nur eine Zeile liest (solange id unique ist).

Wenn du in MySql Feldnamen verwendest, die identisch zu irgendwelchen superglobals sein können, wie "id" ider "ip", dann mach Apostrophe drumrum.
Ich habe keine Ahnung, ob die tatsächlich in Verwendung sind, sprich ob es nötig ist, aber es schadet auf keinen Fall.
Wenn du int Werte verwendest (ich nehme an die id ist vom Typ int), dann ohne Anführungszeichen.
Wenn du Variablen in queries verwendest, dann ausserhalb der Anführungszeichen.
Wenn du schon keine Fehlerprüfung drin hast, dann passt das Ganze auch in eine Zeile.

Code:
$sql = mysql_fetch_object(mysql_query("SELECT `ip` FROM `rating_ip_log` WHERE `id` = ".$id));

if($sql->ip == $ip)
{
...
}

Ich vermute aber eher, dass das Feld ip in deiner DB den falschen Typ hat, so dass da beim reinschreiben gar nicht die richtige IP drin landet und darum der Vergleich fehl schlägt.

Zum Abschluss noch eine Anmerkung:
In Zeiten von NAT, wo immer mehr Provider ganze Städte über dieselbe IP routen, ist jeder Versuch die IP zur Identifikation zu nutzen sinnlos.
 
Hmm also,

Ich gebe meinen Vote ab . Die IP wird auch in die Datenbank eingetragen , jedoch wird immer rating_form und rating_result eingebunden ...
Normal müsste jetzt nach dem vote , nur rating_result eingebunden werden :(

Code:

Code:
$id = $_GET['id'];
    $ip = getenv ("REMOTE_ADDR");
    
    include('core/mysql_connect.php');
    
    
    //ABFRAGE OB IP IN DATENBANK
    $sql = mysql_fetch_object(mysql_query("SELECT `ip` FROM `rating_ip_log` WHERE `id` = ".$id));
    
    
    if($sql->ip==$ip){
    include('rating_result.php');
    }
    else{
    include('rating_result.php');
    include('rating_form.php');
    }
 
Versuchs mal so:

Code:
$id = $_GET['id'];
    $ip = getenv ("REMOTE_ADDR");
    
    include('core/mysql_connect.php');
    
    
    //ABFRAGE OB IP IN DATENBANK
    $sql = mysql_fetch_object(mysql_query("SELECT `ip` FROM `rating_ip_log` WHERE `id` = ".$id));
    
    
    if($sql->ip==$ip){
    print <<<END
    IP = $ip<br>
    SQL->IP = $sql->ip<br>
    ==> include rating_result<br><br>
    END;
    }
    else{
    print <<<END
    IP = $ip<br>
    SQL->IP = $sql->ip<br>
    ==> include rating_result & rating_form<br><br>
    END;
    }

Damit müsstest du sofort sehen, was da nicht stimmt.
 
Also,

du hattest die ""; vergessen oder ?

Naja wenn ich es so mache

Code:
	   //ABFRAGE OB IP IN DATENBANK    $sql = mysql_fetch_object(mysql_query("SELECT `ip` FROM `rating_ip_log` WHERE `id` = ".$id));
    
    
    if($sql->ip==$ip){
    print "<<<END
    IP = $ip<br>
    SQL->IP = $sql->ip<br>
    ==> include rating_result<br><br>
    END;
   "; }
    else{
    print "<<<END
    IP = $ip<br>
    SQL->IP = $sql->ip<br>
    ==> include rating_result & rating_form<br><br>
    END;
    ";}

funktioniert es nicht was meine schuld ist .. ich habe vergessen das es ja nicht die id ist sondern die article_id ;)
Nun klappt es !
 
Mark schrieb:
Wenn du in MySql Feldnamen verwendest, die identisch zu irgendwelchen superglobals sein können, wie "id" ider "ip", dann mach Apostrophe drumrum.
Ich habe keine Ahnung, ob die tatsächlich in Verwendung sind, sprich ob es nötig ist, aber es schadet auf keinen Fall.

„Superglobal“ ist nicht wirklich der passende Ausdruck. Lieber „reservierte Wörter“ oder so.

- MySQL :: MySQL 5.6 Reference Manual :: 8.3 Reserved Words

Ist aber immer gut, da Backticks (keine Apostrophen) drumzusetzen, ja: `DAY`.

Wenn du int Werte verwendest (ich nehme an die id ist vom Typ int), dann ohne Anführungszeichen.

Geht auch mit.

Wenn du Variablen in queries verwendest, dann ausserhalb der Anführungszeichen.

Variablensubstitution würde auch dort stattfinden.

- PHP: Strings - Manual

Stimme dir aber bei beidem vom Standpunkt der höheren Schönheit zu.

Wenn du schon keine Fehlerprüfung drin hast, dann passt das Ganze auch in eine Zeile.

Lesbarkeit?


„The closing identifier must begin in the first column of the line.“

- PHP: Strings - Manual

maria1 schrieb:
Code:
$sql = mysql_fetch_object(mysql_query("SELECT `ip` FROM `rating_ip_log` WHERE `id` = ".$id));

„Liefere mir das ip-Feld aller Datensätze mit der jeweiligen ID.“

Wenn 8 Besucher mit 8 IPs die Seite bewertet haben, liefert die Abfrage 8 Datensätze, wenn ich das richtig interpretiere. Das ist wahrscheinlich nicht, was du willst.

Schema:

Code:
SELECT `ip` FROM `rating_ip_log` WHERE `id` = $id AND `ip` = $ip LIMIT 0,1

if (mysql_num_rows($result) === 1) {
    // IP hat bereits gevotet
}

Außerdem unbedingt beachten:

- Standardantwort zu SQL Injections - PHP Forum: phpforum.de
 
Nein, ich habe die Anführungszeichen nicht vergessen.

print <<<END ... END;

gibt alles zwischen den beiden END als HTML aus, lässt aber alle PHP Variablen zu, ohne dass man (wie bei echo und print) "Text".$variable."text" machen muss.

Ansonsten freue ich mich, wenn es jetzt funktioniert.
 
Nein, ich habe die Anführungszeichen nicht vergessen.

print <<<END ... END;

gibt alles zwischen den beiden END als HTML aus, lässt aber alle PHP Variablen zu, ohne dass man (wie bei echo und print) "Text".$variable."text" machen muss.
Muss man nicht. Du kannst ohne Problem auch ein print "Text $variable text" oder noch besser du benutzt printf, dann kannst du die Formatierung beeinflussen.

Der Vorteil des heredoc ist, dass du einen Mehrzeilige Zeichenkette verwenden kannst, was aber bei PHP nicht unbedingt so nötig ist, da du auch mehrzeilige normale Zeichenketten benutzen kannst.
 
Es gibt viele Wege nach Rom, ich finde halt wenn man anfängt JavaScript oder CSS mit PHP zu mischen, gibt es nichts praktischeres als print <<<END, weil ich mir damit die Anführungszeichen aussen drumrum spare.

Code:
print <<<END
<img src="$bild" onclick="window.location.href='$naechsteseite'" />
END;

Klar kann man das immer noch mit echo oder print ausgeben, aber ich habe mich derartig daran gewöhnt, dass ich HTML absolut immer so ausgebe.
 
Zurück
Oben