Counter

so, die verzweiflung ist nah…
nein, galerie is fertig! aber neues projekt ist nun ein counter. (irgendwo weiter unten hab ich ja schon gefragt)
aber wie man mal wieder so is, beachtet man das „never touch a running system“ nicht und schiesst sich den kompletten counter mitsamt der seite sozusagen ab!

Fatal error: Maximum execution time of 30 seconds exceeded in /path/index.php on line ??

…begrüsste die besucher! (die ?? könnten übrigens orginal sein, denn jeder, den ich gefragt hab, hatte ne andere zeile…)

jetzt häng ich hier seit über 6h stunden an einem eigentlich so einfachem problem und es will einfach net :frowning: (man beachte auch die uhrzeit des postings *g*)
deshalb hier die frage was an meinem code falsch ist:

http://www.geisterkarle.net/counter.txt

so sieht er aus. hab alles haarklein ausführlich gemacht, für fehlersuche; gebracht hat’s nix :frowning:
db anbindung ist vorhanden. die beiden benötigten tabellen dafür:
tabelle ‚counter‘:
id int(10) auto_increment
overall int(10)
day int(10)
datum varchar(255)

tabelle ‚user_ips‘
user_id int(10) auto_increment
time int(100)
ip varchar(255)

was ich erreichen will:
einen counter insgesamt und für den aktuellen tag.
bei wiederholungsbesuchern muss mindestens 1h zwischen den besuchen liegen.

so, ich hoffe irgendwer kann mir auf meiner odyssee helfen!
ich find einfach nix falsches… :frowning:

*erschöpfter*
Geisterkarle

ok schauen wir uns mal den teil an:

 $str="SELECT \* FROM user\_ips ORDER BY time DESC";
 $qry=mysql\_query($str);
 $res=mysql\_fetch\_array($qry);
 $lastvisit=0;
 $user\_ip=" ";
 while ($res && $da!=1) // --- abbruch, wenn gefunden
 {
 $lastvisit=$res[1];
 $user\_ip=$res[2];
 if ($ip==$user\_ip)
 {
 $da=1;
 }
 else
 {
 // --- keine übereinstimmung
 }
 }

a) kann es sein, dass du ne endlosschleife gebaut hast? weil $res in „while (…“ nicht mehr angefasst wird…
b) kann es sein, dass du mit while das ergebnis einer query duchsuchst? wer sowas macht, dem gehoert der account zur db weggenommen. frag doch direkt danach, dafuer sind dbs naemlich gebaut:
$str=„SELECT * FROM user_ips **where ip=“$ip" ORDER BY time DESC limit 1";
wenn du schon das orakel fragen kannst, wer aus deinem schuesselchen gegessen hast, dann tu das und frag nicht „nenne mir alle - ich schau selbst nach ob sie es waren“

generell: dein ansatz ist mist - sorry

schau mal, du kannst fast alles die db machen lassen:

create table iptabelle (ip bigint not null PRIMARY KEY,lastacc bigint unsigned not null);
create table counter ( datum date primary key,cnt bigint unsigned not null);

$ip = ip2long(ipadresse)

//alte ips interessieren mich nicht
delete from iptabelle where lastacc**    

ok schauen wir uns mal den teil an:

$str=„SELECT * FROM user_ips ORDER BY time DESC“;
$qry=mysql_query($str);
$res=mysql_fetch_array($qry);
$lastvisit=0;
$user_ip=" ";
while ($res && $da!=1) // — abbruch, wenn gefunden
{
$lastvisit=$res[1];
$user_ip=$res[2];
if ($ip==$user_ip)
{
$da=1;
}
else
{
// — keine übereinstimmung
}
}

a) kann es sein, dass du ne endlosschleife gebaut hast? weil
$res in „while (…“ nicht mehr angefasst wird…

der soll ja auch alle felder durchgehn, bis er was findet!
wenn ich 100 einträge hab, dann muss er halt 100 einträge durch, dann bricht er ab, oder seh ich das falsche?

b) kann es sein, dass du mit while das ergebnis einer query
duchsuchst? wer sowas macht, dem gehoert der account zur db
weggenommen. frag doch direkt danach, dafuer sind dbs naemlich
gebaut:
$str="SELECT * FROM user_ips where ip="$ip" ORDER BY
time DESC limit 1";
wenn du schon das orakel fragen kannst, wer aus deinem
schuesselchen gegessen hast, dann tu das und frag nicht "nenne
mir alle - ich schau selbst nach ob sie es waren"

jo, das hab ich mal probiert, aber irgendwie hat das ganze nicht geklappt, denn wenn die ip nich drin steht schmeisst er mir erstmal ne fehlermeldung, die ich abfangen muss. und dann hat er, auch wenn se da is, sie immer wieder neu eingetragen! der hat die ip einfach nich erkannt!

generell: dein ansatz ist mist - sorry

schau mal, du kannst fast alles die db machen lassen:

create table iptabelle (ip bigint not null PRIMARY KEY,lastacc
bigint unsigned not null);
create table counter ( datum date primary key,cnt bigint
unsigned not null);

wieso brauch ich da nen bigint?
also wenn ich mal mehr besucher hab, dass es nen normales int sprengt… na hallo…

$ip = ip2long(ipadresse)

//alte ips interessieren mich nicht
delete from iptabelle where lastacc

kann ich mal benutzen!

mfg
Geisterkarle

while ($res && $da!=1) // — abbruch, wenn gefunden

a) kann es sein, dass du ne endlosschleife gebaut hast? weil
$res in „while (…“ nicht mehr angefasst wird…

der soll ja auch alle felder durchgehn, bis er was findet!
wenn ich 100 einträge hab, dann muss er halt 100 einträge
durch, dann bricht er ab, oder seh ich das falsche?

hast du dir denn mal $res ausgeben lassen, kann es sein, dass $res immer das selbe erste element deines resultsets war? du haettest naemlich irgendwo schrieben muessen while($res = mysql_fetch_array($qry)) oder was in der art. dein $res ist und bleibt die erste zeile deines resultsets und wird nicht mehr geaendert, bleibt also so lange true, bis $da 1 wird, weil $ip aber immer gleich bleibt, gibt es eine endlosschleife, wenn die erste ip aus deinem resultset nciht die $userip ist.

b) kann es sein, dass du mit while das ergebnis einer query
duchsuchst? wer sowas macht, dem gehoert der account zur db
weggenommen. frag doch direkt danach, dafuer sind dbs naemlich
gebaut:
$str="SELECT * FROM user_ips where ip="$ip" ORDER BY
time DESC limit 1";
wenn du schon das orakel fragen kannst, wer aus deinem
schuesselchen gegessen hast, dann tu das und frag nicht "nenne
mir alle - ich schau selbst nach ob sie es waren"

jo, das hab ich mal probiert, aber irgendwie hat das ganze
nicht geklappt, denn wenn die ip nich drin steht schmeisst er
mir erstmal ne fehlermeldung, die ich abfangen muss. und dann
hat er, auch wenn se da is, sie immer wieder neu eingetragen!
der hat die ip einfach nich erkannt!

weil du immer schriebst:

$str="SELECT \* FROM counter WHERE id=1";
$qry=mysql\_query($str);
$res=mysql\_fetch\_array($qry);
if ($res)

du musst aber schon $qry pruefen, ob es ein resultset hast, weil wenn er nix findet, ist da nix… und das gibt nen fehler

ich kann dir auch die std-benamung ans herz legen, so zum verstaendnis und so:

$str=„SELECT * FROM counter WHERE id=1“;

$sql (od auch $qry) = „SELECT * FROM counter WHERE id=1“; //das ist naemlich die query

$qry=mysql_query($str);

$res = mysql_query($qry); //weil du ads result einer query bekommst

$res=mysql_fetch_array($qry);
if ($res)

while ($row = mysql_fetch_array($res)) //weil du eine reihe aus dem resultset, dass du dir als 2dim. array vorstellen aknnst erhaelst. und das so lange, wie du zeilen drin hast.

generell: dein ansatz ist mist - sorry

schau mal, du kannst fast alles die db machen lassen:

create table iptabelle (ip bigint not null PRIMARY KEY,lastacc
bigint unsigned not null);
create table counter ( datum date primary key,cnt bigint
unsigned not null);

wieso brauch ich da nen bigint?
also wenn ich mal mehr besucher hab, dass es nen normales int
sprengt… na hallo…

stoer dich nicht daran… kannst natuerlich auch nen kuerzeren nehmen.

$ip = ip2long(ipadresse)

//alte ips interessieren mich nicht
delete from iptabelle where lastacc

while ($res && $da!=1) // — abbruch, wenn gefunden

a) kann es sein, dass du ne endlosschleife gebaut hast? weil
$res in „while (…“ nicht mehr angefasst wird…

der soll ja auch alle felder durchgehn, bis er was findet!
wenn ich 100 einträge hab, dann muss er halt 100 einträge
durch, dann bricht er ab, oder seh ich das falsche?

hast du dir denn mal $res ausgeben lassen, kann es sein, dass
$res immer das selbe erste element deines resultsets war? du
haettest naemlich irgendwo schrieben muessen while($res =
mysql_fetch_array($qry)) oder was in der art. dein $res ist
und bleibt die erste zeile deines resultsets und wird nicht
mehr geaendert, bleibt also so lange true, bis $da 1 wird,
weil $ip aber immer gleich bleibt, gibt es eine
endlosschleife, wenn die erste ip aus deinem resultset nciht
die $userip ist.

ahso…
mist, da wollt mers mal schöner aussehen lassen und dann funkt das nich. das hab ich verbockt; wieder was gelernt!

if ($ip=$t0) { abbruch, den hab ich schon }

zu dem bug hast nix gesagt. muss natuerlich: if ($ip==$t0)
heissen.

kann ja nich alles entdecken :wink:

übrigens läuft es jetzt anscheinend!
nachzuprüfen auf http://www.geisterkarle.net :smile:

mfg
Geisterkarle