php-resource




Archiv verlassen und diese Seite im Standarddesign anzeigen :
IF - Problem


 
P2oldi
06-06-2003, 12:57 
 
Mahlziet zusammen,

ich hab wieder ein kleines Problem, wahrscheinlich steh ich nur auf dem Schlauch ;)

Ich bastel mir grad nen kleinen Vote zusammen, und versuche nun praktisch eine 1-tägige IP-Sperre zu basteln. Da hakt es dann allerdings irgendwie bei der IF-Abfrage :(

hier der Code:
<?
//Verbindung zur DB herstellen
include "include/connect2db.inc.php";

$checkipsql = "select max(zeit) + INTERVAL 1 DAY from votes where user = '".$HTTP_SERVER_VARS['REMOTE_ADDR']."'";
$ipresult = mysql_query($checkipsql, $dblink) or die(mysql_error());
$ip = mysql_fetch_array($ipresult);

if (selektierte Zeit + 1 Tag != leer && selektierte Zeit + 1 Tag < strftime("%Y-%m-%d %H:%M:%S", time())
header("Location:index.php?modul=showvote&voted=already");
else
{
$sql = "insert into votes (id, opt".$_POST['vote'].", zeit, user) values(1, 1, now(), '".$HTTP_SERVER_VARS['REMOTE_ADDR']."')";
$result = mysql_query($sql, $dblink) or die(mysql_error());
header("Location:index.php?modul=showvote&voted=yes");
}
?>

die IF-Abfrage hab ich mal pseudo ausformuliert, wäre supern wenn mir da jemand auf die Sprünge helfen könnte.

ich hab schon das hier probiert:
if (!empty($ip['zeit']) && $ip['zeit'] < strftime("%Y-%m-%d %H:%M:%S", time())) aber das funz leider net, jedenfalls ist die Bedingung immer false.

Oder liegt es vielleicht am SQL-Statement? Bin grade total ratlos wie ich das machen soll...

 
Moqui
06-06-2003, 13:03 
 
dasn bissle umständlich....

ich würds anders machen...

1. Errechne Differenz aus time() (Timestamp) und den Sekunden, wie lange die Sperre halten soll.

2. Lösch alle aus der Datenbank, bei denen der eingetragene Timestamp < als aktueller timestamp.

3. Hol die Einträge mit einer Where Klausel. where ip = $_SERVER["REMPTE_ADDR"]

4. wenn mysql_num_rows() > 0 dann unterbinde die folgenden aktionen...er darf nämlich nicht.

sollte mysql_num_rows() == 0 sein, dann trage seine IP mit timestamp in die DB ein und lass ihn alles machen was er will

ich kann dir mal ein Code-Scnipsel beifügen:


$ip_c = $_SERVER["REMOTE_ADDR"];
$zeit_c = time();

$con_c = @mysql_connect($mmvars["mysql"][0]["host"], $mmvars["mysql"][0]["user"], $mmvars["mysql"][0]["password"]);
$db_c = @mysql_select_db($mmvars["mysql"][0]["db"]);

if (!$con_c || !$db_c) {
header("Location: ./community/msg.php?msg=Die+Datenbank+ist+nicht+verfuegbar");
exit();
}

$del_c = $zeit_c - $mmvars["counter"]["refresh_time"];

@mysql_query("delete from ip_lock_visits where time < $del_c");

$res_c = @mysql_query("select count(*) AS zahl from ip_lock_visits where ip = '$ip_c'");
$row_c = @mysql_fetch_array($res_c);
if($row_c["zahl"] == 0) {
@mysql_query("insert into ip_lock_visits set time = '$zeit_c', ip = '$ip_c'");
@mysql_query("update visits set count = count + 1");
}
@mysql_close($con_c);

 
P2oldi
06-06-2003, 13:33 
 
ich habe mal versucht Deinen Schnipsel für mich umzubasteln, allerdings läuft das noch nicht ganz rund, ich denke es hängt mit den Datentypen zusammen...

<?
//Verbindung zur DB herstellen
include "include/connect2db.inc.php";

$ip = $_SERVER["REMOTE_ADDR"];
$zeit = time();

$del = $zeit - 86400; // also jetzt - 1 Tag

mysql_query("delete from ip_locks where time < $del", $dblink);

$res = mysql_query("select count(*) AS zahl from ip_locks where ip = '$ip'", $dblink) or die(mysql_error());
$row = mysql_fetch_array($res);

if(mysql_num_rows($res) > 0)
header("Location:index.php?modul=showvote&voted=already");
else
{
mysql_query("insert into ip_locks(time, ip) values(".$zeit.", '".$ip."')", $dblink);
mysql_query("insert into votes (id, opt".$_POST['vote'].") values(1, 1)", $dblink);
header("Location:index.php?modul=showvote&voted=yes");
}

?>

funzt alles wunderbar, ich darf nur einmal voten.

Liegt aber glaub ich daran, das jetzt in meiner Tabelle
CREATE TABLE ip_locks (
time timestamp,
ip varchar(15)
)

bei Time eine 14-stellige Zahl steht, mir oben die Variable $zeit aber nur eine 10-stellige Zahl liefert.

Bsp.:
Tabelle: 20001125175125
$zeit: 1054895125

insofern kann er die Einträge ja nie wieder aus der Tabelle löschen, da $del aufgrund der 4 Stellen weniger immer kleiner ist als time.

hab ich Dich falsch verstanden, und der Typ in der Tabelle ist nicht timestamp?

hab den Table gedroppt und mit Datentyp time für die Zeitspalte neu angelegt, aber nun darf ich gar nicht mehr voten, da mysql_num_rows($res) immer 1 liefert, auch wenn der Table leer ist?!?!

 
Wurzel
06-06-2003, 13:47 
 
definier time als int(10), dann ist dein problem behoben

warum das so ist, steht hier:
http://www.mysql.com/doc/en/DATETIME.html

 
Moqui
06-06-2003, 13:52 
 
sieht bei mir so aus....


+-------+----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| time | int(10) | YES | | NULL | |
| ip | tinytext | YES | | NULL | |
+-------+----------+------+-----+---------+-------+

 
a4u
06-06-2003, 14:09 
 
Man nehme

$res = mysql_query("select count(*) AS zahl from ip_locks where ip = '$ip'", $dblink) or die(mysql_error());
$row = mysql_fetch_array($res);

if(mysql_num_rows($res) > 0)
header("Location:index.php?modul=showvote&voted=already");
else
{
mysql_query("insert into ip_locks(time, ip) values(".$zeit.", '".$ip."')", $dblink);
mysql_query("insert into votes (id, opt".$_POST['vote'].") values(1, 1)", $dblink);
header("Location:index.php?modul=showvote&voted=yes");
}

und schreibe

$res = mysql_query("select count(*) AS zahl from ip_locks where ip = '$ip'", $dblink) or die(mysql_error());

if(mysql_num_rows($res) > 0)
header("Location:index.php?modul=showvote&voted=already");
else
{
mysql_query("insert into ip_locks(time, ip) values(".$zeit.", '".$ip."')", $dblink);
mysql_query("insert into votes (id, opt".$_POST['vote'].") values(1, 1)", $dblink);
header("Location:index.php?modul=showvote&voted=yes");
}

Das muss durchaus nicht die Lösung sein, aber es macht keinen Sinn grundsätzlich einen Array zu lesen, wenn eventuell überhaupt keiner vorhanden ist.

Des weiteren würde ich die SQL-Anfrage durch:
SELECT ip FROM ip_locks WHERE ip = '$ip'
ersetzen. Dann kannst du nochmals prüfen, ob nicht eventuell eine leere IP oder z.B. 127.0.0.1 als "gesperrt" eingetragen worden ist.

 
P2oldi
06-06-2003, 14:34 
 
Original geschrieben von a4u
SELECT ip FROM ip_locks WHERE ip = '$ip'

das war's :) Anscheinend hat der count(*) eine 0 zurückgeliefert als Ergebnis und das stand wohl in der ersten Zeile -> mysql_num_rows = 1

aber nun funzt es wunderbar, vielen Dank nochmal an alle

 
a4u
06-06-2003, 14:39 
 
Wo ich mir jetzt nochmal das durchlese - kein Wunder - du wolltest etwas ZÄHLEN - natürlich gibt er dort EIN Ergebnis zurück - nämlich die Zahl 0 - aber du fragtest ja nicht nach dem Inhalt des ausgelesenen Strings sondern ob überhaupt eine Rückgabe stattfindet - und die war 1.

Ich würde für diesen Fehler auf meiner Seite "Betriebsblindheit" als Begründung bringen - man sucht halt immer nach einem komplizierten Problem als in echt vorliegt ;) :)

 
P2oldi
06-06-2003, 15:57 
 
eben, hätte dann lieber nachfragen sollen, ob das zurückgegebene Ergebnis > 0 ist, nicht ob überhaupt eins da ist :)

aber wurst, nu geht's ja ;)

 
Master-T
06-06-2003, 20:38 
 
$res = mysql_query("select count(*) AS zahl from ip_locks where ip = '$ip'", $dblink) or die(mysql_error());

if(mysql_num_rows($res) > 0)
header("Location:index.php?modul=showvote&voted=already");
}
else
{
mysql_query("insert into ip_locks(time, ip) values(".$zeit.", '".$ip."')", $dblink);
mysql_query("insert into votes (id, opt".$_POST['vote'].") values(1, 1)", $dblink);
header("Location:index.php?modul=showvote&voted=yes");
}


ich würde das so schreiben.

MFG T

 
a4u
07-06-2003, 10:34 
 
Original geschrieben von Master-T

$res = mysql_query("select count(*) AS zahl from ip_locks where ip = '$ip'", $dblink) or die(mysql_error());

if(mysql_num_rows($res) > 0)
header("Location:index.php?modul=showvote&voted=already");
}
else
{
mysql_query("insert into ip_locks(time, ip) values(".$zeit.", '".$ip."')", $dblink);
mysql_query("insert into votes (id, opt".$_POST['vote'].") values(1, 1)", $dblink);
header("Location:index.php?modul=showvote&voted=yes");
}


ich würde das so schreiben.

MFG T Und damit genau den selben Fehler machen - es gibt IMMER ein Ergebnis für "mysql_num_rows". Nämlich die Anzahl der Treffer - selbst wenn diese 0 ist, gibt "mysql_num_rows" 1 zurück.

PS.: Wo ist bei dem Quellcode groß der Unterschied zum Original, außer das du die eine Zeile entfernt hast, die auch ich bereits als unnötig deklariert habe?!?


Alle Zeitangaben in WEZ +2. Es ist jetzt 02:09 Uhr.