Seite 1 von 2

Was ist an der SQL-Abfrage falsch?

Verfasst: 04.12.2007 10:35
von Max
Hallo,


ich fummele schon einige Zeit an einer Abfrage herum.

Ziel ist es, für eine Art Counter die IP für eine gewisse Zeitspanne zu sperren.

Nun habe ich eine Tabelle angelegt mit ip, zeit, user_id und zaehlobjekt

Die Daten dort einzutragen und zeitgemäß zu löschen, klappt hervorragend, aber ich bin momentan zu blöd, die IPs auszulesen, so dass ich die Sperr-Routine in Gang bekomme.


Hier mal der Code dafür:

Code: Alles auswählen

$sql1 = "SELECT * FROM " . $table_prefix . "counter_ip";
$result	= $db -> sql_query($sql1);
	if ( !($result = $db->sql_query($sql1)) )
	{
		message_die(GENERAL_ERROR, 'Error .', '', __LINE__, __FILE__, $sql1);
	}
	while($row	= $db -> sql_fetchrow($result))
	{
		$verip = "IP:".$row['ip'];
  }
Zur Erklärung:
- $uip ist die zuvor erfasste reale IP
- $verip soll die gespeicherte IP sein. Die soll nachher für das Zählobjekt verwendet werden, um das nicht wieder einzublenden, oder eine Doppelzählung innerhalb einer Zeitspanne zu vermeiden.

- das "IP:". habe ich nur darin stehen, weil ich zu Testzwecken später im Script via echo $verip; den Wert anzeigen lasse, da ich aber nie etwas zu sehen bekomme, habe ich dort Text eingesetzt (der erscheint leider auch nicht)


Sicherlich obliege ich hier momentan einem ganz gewaltigen Denkfehler, aber ich stehe momentan total auf dem Schlauch.


Später möchte ich z.B. via:

Code: Alles auswählen

if (($verip != $uip ) && !isset($_COOKIE['CounterX']))
{
.
.
.
}
Die Zählung laufen lassen, außerdem brauche ich im Velauf des Scriptes immer mal einen Wert aus der Tabelle, der sich auf das Zählobjekt, manchmal die User_ID und die IP bezieht, um eine Doppelanzeige zu vermindern.


Wäre schön, wenn ich hier den passenden Schub bekomme, der mich weiterbringt.




Gruß Max

Verfasst: 04.12.2007 11:20
von disler
Also, soviel ich weis, gibt es sql_query() nicht!

Ändere das mal in mysql_query($deine_Variable) um! So wie auch sql_fetchrow! Ändere das ebenfalls mal in mysql_fetch_array($deine_Variable) um!

Versuche es mal so!

Verfasst: 04.12.2007 12:01
von Max
Hallo,


danke für die Antwort.
Aber leider bringt das nichts, außer einer Fehlermeldung.
Fatal error: Call to undefined method sql_db::mysql_query()
Kommt, wenn ich:

Code: Alles auswählen

$result	= $db -> sql_query($sql1);
in:

Code: Alles auswählen

$result	= $db -> mysql_query($sql1);
abändere.



Gruß Max

Verfasst: 04.12.2007 12:09
von Seimon
Lass mal die Zeile weg:

Code: Alles auswählen

$result   = $db -> sql_query($sql1);

Verfasst: 04.12.2007 12:13
von disler
also bei deinem SQl String
$sql1 = "SELECT * FROM " . $table_prefix . "counter_ip";
, was steht da genau in der Variable??


Versuche es doch so:

$ipverweigerungszeit = time() + 3600; //Anzahl in Sekunden wie langs dauern soll

$sql = UPDATE deine tbl SET userip =" . $reale_Ip . , gespeert = $ipverweigerungszeit";

mysql_query($sql);

Danach fragst du auf der Seite oben immer ab:
//Hier komtm die SQL abfrage, wo du die Daten wieder rausliest!

if ($ipverweigerungszeit < time()) { echo "immer noch gespeert!"; }

Verfasst: 04.12.2007 12:15
von Max
Seimon hat geschrieben:Lass mal die Zeile weg:

Code: Alles auswählen

$result   = $db -> sql_query($sql1);
Das bewirkt gar nichts, keinen Erfolg, keinen Fehler...

Irgendwie bin ich völlig ratlos.

Verfasst: 04.12.2007 12:19
von disler
Diese Zeile braucht er unbedingt! Sonst schreibt es ja nicht in die DB!

Verfasst: 04.12.2007 12:26
von Max
Hallo,

ich schreibe es mal in Schritten:

Beim Zählen wird das gemacht:

Code: Alles auswählen

$sql = "INSERT INTO ". $table_prefix . "counter_ip
      VALUES ('$akzeit', '$uip', '$voter_id', '$objekt_id')";
Hier wird nun die Zeit (Zeitpunkt des Eintrags), die zu dem Zeitpunkt genutzte IP, die User-ID des Teilnehmers und die ID des Zählobjektes eingetragen.

Das klappt ohne Probleme.

Nun habe ich auch eine Löschroutine für abgelaufene Einträge:

Code: Alles auswählen

$del1 = "DELETE FROM " . $table_prefix . "counter_ip WHERE zeit<'".$loeschen."'"; 
$r1 = $db -> sql_query($del1); 
Klappt auch ohne Probleme, so habe ich nie mehr Einträge in der Tabelle, als die vorgegebene Sperrzeit nach sich zieht.


Mein Problem ist halt, dass ich weder die gesperrten IPs, noch die gezählten Objekte/IP abrufen kann.
Ich brauche beides immer mal wieder in dem Script.


Gruß Max

Verfasst: 04.12.2007 12:34
von disler

Code: Alles auswählen

$sql = "Select * From [b]deine_tabelle[/b] where [i][u]BEDINGUNG[/u][/i]";
$sql_raus = mysql_query($sql);
if ($row=mysql_fetch_array($sql_raus))
{
         $attribut1 = $row['attributname_in_tbl'];
         fortfolgend
}
$ip = getenv('REMOTE_ADDR');//oder $_SERVER['REMOTE_ADDR'];


BEDINGUNG wo das steht, musst du deine Bedingung angeben! Also zum Beispiel where gesperrteip = $ip

Verfasst: 04.12.2007 13:07
von Max
Hallo,


und wieder danke :-)


Ich könnte mir wo hin beißen.

Das habe ich auch schon gehabt, das Gruselige ist, dass ich dachte, es wäre falsch.
Dieser Code ging ( an der Stelle im Script) auch nicht. Da ich nun davon ausging, dass das nicht sein kann, habe ich einfach mal den Abschnitt woanders im Script positioniert und schon läuft es.

So was ist ja direkt etwas nervig - minimaler Fehler, maximale Folge.




Gruß Max