|
| Skummel kode som sikkert kan gøres nemmere Fra : Andreas Kryger Jense~ |
Dato : 26-03-02 18:54 |
|
Hej,
Jeg sad i nattens mulm og mørke og forsøgte at strikke noget kode sammen,
der
kunne løse mit problem.
Jeg har et array med ip-adresser. Disse adresser skal alle sammenlignes, og
hvis der
findes 3 eller flere ens, skal denne adresse (som der er 3 eller flere af)
sammenlignes
med en værdi i et andet array med tilsvarede index.
Forvirret? Her kommer et eksempel.
$ip er et array der indeholder 5 adresser. $number er et array der
indeholder 5 værdier,
der parvis hører sammen med værdierne i $ip. Altså $ip[0] hører sammen med
$number[0] osv.
Værdierne i $ip skal så alle sammenlignes.
0 sammenlignes med 1,2,3,4. 1 sammenlignes med 2,3,4. 2 med 3, 4, osv.
Man finder så ud af at $ip[0], $ip[2] og $ip[3] er ens. Så skal forskellen
mellem $number[0] og $number[3]
findes. Altså det laveste og det højeste index.
Her var hvad jeg fik smækket sammen, men jeg er nu lidt i tvivl, om jeg er
gået på vildspor.
Det må næsten kunne gøres mere simpelt. :(
---------skummel php----------------
$f = 1;
$k = 0;
for($a=$k;$a<count($ip);$a++){
echo "ip nr. $a sammenlignes med ip nr. ";
$b=$a+1;
for($k=$b;$k<=count($ip);$k++){
echo "$k ";
if($ip[$a]==$ip[$k]){
echo "<u>!!!$a = $k!!!</u> ";
$f++;
// echo "<u>***$f***</u>";
if($f>=3){
echo "<u><b>*** $ip[$a] skal sendes videre, da den findes $f
gange</b></u>";
}
}
}
$f=1;
echo "<br>";
}
--------skummel php-----------------
Det er meget muligt, at koden ikke giver nogen mening, men den kan ses i
aktion på
http://www.xylo.myip.org/test/skummelt.php
Al vejledning samt hjælp modtages med kyshånd... :)
--
Best regards / Mes meilleures amitiés / Med venlig hilsen
Andreas Kryger Jensen
http://www.compose.subnet.dk
linux er gratis, hvis din tid er værdiløs
| |
Jonas Delfs (26-03-2002)
| Kommentar Fra : Jonas Delfs |
Dato : 26-03-02 19:21 |
|
"Andreas Kryger Jensen" <xylofonius@hotpop.com> skrev i en meddelelse
news:a7qckb$bee$1@sunsite.dk...
> Jeg sad i nattens mulm og mørke og forsøgte at strikke noget kode sammen,
> der
> kunne løse mit problem.
> Jeg har et array med ip-adresser. Disse adresser skal alle sammenlignes,
og
> hvis der
> findes 3 eller flere ens, skal denne adresse (som der er 3 eller flere af)
> sammenlignes
> med en værdi i et andet array med tilsvarede index.
Det er altid spændende at rode med sådanne lækre små opgaver, så prøv selvom
det måske viser sig slet ikke at være nødvendigt :), men tror du ikke at den
funktionalitet du prøver at opnå kan klares lidt mere elegant? Måske kan vi
hjælpe hvis du forklarer hvad det er du vil opnå.
--
Mvh./Best Regards
Jonas Delfs, http://delfs.dk
| |
Andreas Kryger Jense~ (26-03-2002)
| Kommentar Fra : Andreas Kryger Jense~ |
Dato : 26-03-02 20:08 |
|
> Det er altid spændende at rode med sådanne lækre små opgaver, så prøv
selvom
> det måske viser sig slet ikke at være nødvendigt :), men tror du ikke at
den
> funktionalitet du prøver at opnå kan klares lidt mere elegant?
Jo, det var sådan set også det, jeg efterlyste.
> Måske kan vi
> hjælpe hvis du forklarer hvad det er du vil opnå.
Det var sådan set også det, jeg prøvede på, men skidt... jeg prøver igen :)
Idéen er, at der bliver ført en form for log ved en bestemt hendelse.
Denne log er en alm. txt-fil, der indeholder brugerens ip samt et timestamp.
Hvis en bestemt ip optræder tre eller flere gange inden for et døgn, skal
brugeren smides hen til en anden side.
Mit forsøg derpå har jeg vist beskrevet så rigeligt i den forgående post.
--
Best regards / Mes meilleures amitiés / Med venlig hilsen
Andreas Kryger Jensen
http://www.compose.subnet.dk
linux er gratis, hvis din tid er værdiløs
| |
Jonas Delfs (26-03-2002)
| Kommentar Fra : Jonas Delfs |
Dato : 26-03-02 20:27 |
|
"Andreas Kryger Jensen" <xylofonius@hotpop.com> skrev i en meddelelse
news:a7qgu0$q1l$1@sunsite.dk...
> > Det er altid spændende at rode med sådanne lækre små opgaver, så prøv
> selvom
> > det måske viser sig slet ikke at være nødvendigt :), men tror du ikke at
> den
> > funktionalitet du prøver at opnå kan klares lidt mere elegant?
> Jo, det var sådan set også det, jeg efterlyste.
Du misforstår.
Jeg tænker dybere: Du er højst sandsynligt ved at skrive noget der skal ende
med at være en funktion brugere kan drage nytte af. Hvordan du opnår denne
funktionalitet kommer an på design.
Det jeg vil have dig til er at forklare hvad den endelige funktionalitet
skal være, og måske revurdere dit design/valg af løsning.
--
Mvh./Best Regards
Jonas Delfs, http://delfs.dk
| |
Andreas Kryger Jense~ (26-03-2002)
| Kommentar Fra : Andreas Kryger Jense~ |
Dato : 26-03-02 20:40 |
|
> Du misforstår.
Ja, det gør jeg vist...
> Jeg tænker dybere: Du er højst sandsynligt ved at skrive noget der skal
ende
> med at være en funktion brugere kan drage nytte af. Hvordan du opnår denne
> funktionalitet kommer an på design.
> Det jeg vil have dig til er at forklare hvad den endelige funktionalitet
> skal være, og måske revurdere dit design/valg af løsning.
Jeg er ikke sikker på, at jeg kan forklare det på en anden måde.
Generelt vil jeg sikre mig, at den samme tekst-streng ikke er skrevet i en
fil mere end 3 gange på 24 timer.
--
Best regards / Mes meilleures amitiés / Med venlig hilsen
Andreas Kryger Jensen
http://www.compose.subnet.dk
linux er gratis, hvis din tid er værdiløs
| |
Niels Andersen (26-03-2002)
| Kommentar Fra : Niels Andersen |
Dato : 26-03-02 21:22 |
|
Andreas Kryger Jensen wrote in <a7qipi$2ia$1@sunsite.dk>:
> Jeg er ikke sikker på, at jeg kan forklare det på en anden måde.
> Generelt vil jeg sikre mig, at den samme tekst-streng ikke er skrevet i en
> fil mere end 3 gange på 24 timer.
Det Jonas fisker efter er vist: Hvorfor? Hvad skal det bruges til?
> linux er gratis, hvis din tid er værdiløs
En ret underlig bemærkning.
Jeg har i øvrigt sparet meget tid (og dermed mange af mine kunders penge)
ved at bruge Gnu(/Linux)-baserede løsninger.
Og hvis du mener prisen er det mest attraktive ved Linux, så er vi slet
ikke enige. Jeg har selv været med til projekter, hvor valget mellem
Linux/BSD/Windows (en af de dyre, "pro server" eller hvad de nu kalder det)
ville fylde under 1% af omkostningerne til hardware og software. Alligevel
valgte man Linux, da den gode pris kun er en lille detalje.
Argh, jeg er for nem at provokere.
--
Mvh.
Niels Andersen
| |
Andreas Kryger Jense~ (26-03-2002)
| Kommentar Fra : Andreas Kryger Jense~ |
Dato : 26-03-02 21:34 |
|
"Niels Andersen" <niels-usenet@myplace.dk> wrote in message
news:PL4o8.514$567.72288@news000.worldonline.dk...
> Andreas Kryger Jensen wrote in <a7qipi$2ia$1@sunsite.dk>:
> > Jeg er ikke sikker på, at jeg kan forklare det på en anden måde.
> > Generelt vil jeg sikre mig, at den samme tekst-streng ikke er skrevet i
en
> > fil mere end 3 gange på 24 timer.
>
> Det Jonas fisker efter er vist: Hvorfor? Hvad skal det bruges til?
Aha! For at sikre at brugeren ikke bruger min "service" mere end 3 gange pr.
døgn.
> > linux er gratis, hvis din tid er værdiløs
> En ret underlig bemærkning.
[SNIP]
> Argh, jeg er for nem at provokere.
Hehe :) Den er kun ment som en provokation. :)
Jeg er selv lejlighedsvis Linux/freeBSD bruger.
--
Best regards / Mes meilleures amitiés / Med venlig hilsen
Andreas Kryger Jensen
http://www.compose.subnet.dk
linux er gratis, hvis din tid er værdiløs
| |
Jonas Delfs (26-03-2002)
| Kommentar Fra : Jonas Delfs |
Dato : 26-03-02 21:37 |
|
"Andreas Kryger Jensen" <xylofonius@hotpop.com> skrev i en meddelelse
news:a7qm0d$bcq$1@sunsite.dk...
> "Niels Andersen" <niels-usenet@myplace.dk> wrote in message
> news:PL4o8.514$567.72288@news000.worldonline.dk...
> > Andreas Kryger Jensen wrote in <a7qipi$2ia$1@sunsite.dk>:
> > > Jeg er ikke sikker på, at jeg kan forklare det på en anden måde.
> > > Generelt vil jeg sikre mig, at den samme tekst-streng ikke er skrevet
i
> en
> > > fil mere end 3 gange på 24 timer.
> >
> > Det Jonas fisker efter er vist: Hvorfor? Hvad skal det bruges til?
Præcist.
> Aha! For at sikre at brugeren ikke bruger min "service" mere end 3 gange
pr.
> døgn.
Vi behøver vel ikke oplyse dig om IP-tjeks usikkerhed, eller skulle man sige
upræcished, vel?
Jeg faldt over dit spørgsmål et par tråde lidt længere nede og kan se du har
dine IP-adresser fra en række filer.
Det kan være vi skal så langt tilbage i dit valg af software design for at
finde "flaskehalsen": Hvorfra kommer IP-adresserne? Hvorfor i mange filer,
og ikke kun en?
--
Mvh./Best Regards
Jonas Delfs, http://delfs.dk
| |
Andreas Kryger Jense~ (26-03-2002)
| Kommentar Fra : Andreas Kryger Jense~ |
Dato : 26-03-02 21:48 |
|
> Vi behøver vel ikke oplyse dig om IP-tjeks usikkerhed, eller skulle man
sige
> upræcished, vel?
Nej, egentlig ikke :)
> Jeg faldt over dit spørgsmål et par tråde lidt længere nede og kan se du
har
> dine IP-adresser fra en række filer.
Det var om noget helt andet...
> Det kan være vi skal så langt tilbage i dit valg af software design for at
> finde "flaskehalsen": Hvorfra kommer IP-adresserne? Hvorfor i mange filer,
> og ikke kun en?
Det er én fil, der ser således ud:
xxx.xxx.xxx.xxx-timestamp(x)
yyy.yyy.yyy.yyy-timestamp(y)
. . . -timestamp(z)
osv.
--
Best regards / Mes meilleures amitiés / Med venlig hilsen
Andreas Kryger Jensen
http://www.compose.subnet.dk
linux er gratis, hvis din tid er værdiløs
| |
Jonas Delfs (26-03-2002)
| Kommentar Fra : Jonas Delfs |
Dato : 26-03-02 21:52 |
|
"Andreas Kryger Jensen" <xylofonius@hotpop.com> skrev i en meddelelse
news:a7qmp4$dmj$1@sunsite.dk...
> Det er én fil, der ser således ud:
> xxx.xxx.xxx.xxx-timestamp(x)
> yyy.yyy.yyy.yyy-timestamp(y)
> . . . -timestamp(z)
> osv.
Er der vigtigt at der arbejdes ud fra dit array? (læs: skal det bruges til
andet eller kan jeg komme med et andet løsningsforslag?)
Hvis ikke:
- Det du vil er at tjekke hvorvidt værdien af $REMOTE_ADDR er skrevet i
filen inden for det sidste døgn 3 eller flere gange, eller?
- Er "timstamp" et unix timestamp, eller?
- Hvad er x/y/z?
--
Mvh./Best Regards
Jonas Delfs, http://delfs.dk
| |
Andreas Kryger Jense~ (26-03-2002)
| Kommentar Fra : Andreas Kryger Jense~ |
Dato : 26-03-02 22:01 |
|
> > Det er én fil, der ser således ud:
> > xxx.xxx.xxx.xxx-timestamp(x)
> > yyy.yyy.yyy.yyy-timestamp(y)
> > . . . -timestamp(z)
> > osv.
> Er der vigtigt at der arbejdes ud fra dit array? (læs: skal det bruges til
> andet eller kan jeg komme med et andet løsningsforslag?)
Nej, det er ikke vigtigt, at det er et array. Jeg startede bare med at læse
alle ip'erne ind i array
og alle timestamp'ene ind i et. Det troede jeg var smart :) Så ville f.eks.
$ip[3] og $time[3] svare til hinanden.
Men som sagt... alle forslag modtages med kyshånd - eller bare tak :)
> Hvis ikke:
> - Det du vil er at tjekke hvorvidt værdien af $REMOTE_ADDR er skrevet i
> filen inden for det sidste døgn 3 eller flere gange, eller?
Helt korrekt!
> - Er "timstamp" et unix timestamp, eller?
Jep - altså time();
> - Hvad er x/y/z?
det er bare en vilkårlig ip-adresse; altså $REMOTE_ADDR
--
Best regards / Mes meilleures amitiés / Med venlig hilsen
Andreas Kryger Jensen
http://www.compose.subnet.dk
Linux er PERFEKT, hvis din tid er letkøbt :)
| |
Jonas Delfs (26-03-2002)
| Kommentar Fra : Jonas Delfs |
Dato : 26-03-02 23:08 |
|
"Andreas Kryger Jensen" <xylofonius@hotpop.com> skrev i en meddelelse
news:a7qnj4$gdr$1@sunsite.dk...
> > > Det er én fil, der ser således ud:
> > > xxx.xxx.xxx.xxx-timestamp(x)
> > > yyy.yyy.yyy.yyy-timestamp(y)
> > > . . . -timestamp(z)
> > > osv.
> > - Hvad er x/y/z?
> det er bare en vilkårlig ip-adresse; altså $REMOTE_ADDR
Jeg kan godt regne ud at fx. xxx.xxx.xxx.xxx er en eksempel-ip adresse, men
hvad med det x/y/z i parentesen efter timestamp?
Følgende er fuldstændig utestet, og skrevet af en halvtræt fyr der de sidste
par timer udelukkende har kodet Ruby, ikke PHP. :)
function tjek_ip() {
$nu = time(); // Sekunder siden Unix epoch
$igaar = $nu - (3600*24); // Sekunder siden Unix epoch - et døgn
$file = file('fil.txt', 'r'); // Læser indholdet af filen ind i et array
for($i=0; $i < count($file); $i++) { // Looper array'et igennem
list($ip, $timestamp) = explode('-', $file[$i]); // Deler linien ved
"-"
$timestamp = preg_replace("\(.+\)$", "", $timestamp); // Fjerner
(bogstaverogtalher) i slutningen af linie hvis det skulle forekomme
if ($timestamp < $nu && $timestamp > $igaar) { // Hvis linien er
skrivet i filen indenfor det sidste døgn
if ($list[$ip] >= 3) { // Hvis IP er i filen 3 eller flere gange
return false; // Returner falsk
}
if ($ip == getenv("REMOTE_ADDR")) { // Tjekke om brugers IP er
lig den i filen
$list[$ip]++; // Registrerer at IP'en fra den pågældende
linie er fundet
}
}
}
return true; // Returner true
}
if (tjek_ip()) {
echo $REMOTE_ADDR.' har ikke benyttet servicen 3 eller flere gange i
dag.';
} else {
echo $REMOTE_ADDR.' har benyttet servicen 3 eller flere gange i dag.';
}
Om du synes det er mindre skummelt/kryptisk end din egen løsning må du selv
vurdere.
Da jeg er i tvivl om hvorvidt liniene egentligt ender med parenteser satte
jeg en lille preg_replace() ind. Fjern den blot hvis en linie udelukkende
består af IP, bindestreg og timestamp.
Alt ovenstående er skrevet meget hurtigt, så der er sikkert fejl. :) Du
forstår sikkert pointen.
--
Mvh./Best Regards
Jonas Delfs, http://delfs.dk
| |
Andreas Kryger Jense~ (26-03-2002)
| Kommentar Fra : Andreas Kryger Jense~ |
Dato : 26-03-02 23:34 |
|
> > det er bare en vilkårlig ip-adresse; altså $REMOTE_ADDR
>
> Jeg kan godt regne ud at fx. xxx.xxx.xxx.xxx er en eksempel-ip adresse,
men
> hvad med det x/y/z i parentesen efter timestamp?
Nåe - det var for at vise at ip og timestamp hørte sammen parvis.
> Følgende er fuldstændig utestet, og skrevet af en halvtræt fyr der de
sidste
> par timer udelukkende har kodet Ruby, ikke PHP. :)
Det går nok... :)
[SNIP - kode der umiddelbart ser dejlig ud] :)
> Om du synes det er mindre skummelt/kryptisk end din egen løsning må du
selv
> vurdere.
Umiddelbart vil jeg siger, at den ser mere "lige til" ud.
> Da jeg er i tvivl om hvorvidt liniene egentligt ender med parenteser satte
> jeg en lille preg_replace() ind. Fjern den blot hvis en linie udelukkende
> består af IP, bindestreg og timestamp.
Ok, men linien ender med timestamp.
> Alt ovenstående er skrevet meget hurtigt, så der er sikkert fejl. :) Du
> forstår sikkert pointen.
Jep, men jeg får det nok først set igennem i morgen.
Så skal du nok få kyshånden der :)
Indtil videre får det et kæmpe tak for din indsats.
--
Best regards / Mes meilleures amitiés / Med venlig hilsen
Andreas Kryger Jensen
http://www.compose.subnet.dk
Linux er PERFEKT, hvis din tid er letkøbt :)
| |
Andreas Kryger Jense~ (27-03-2002)
| Kommentar Fra : Andreas Kryger Jense~ |
Dato : 27-03-02 21:07 |
|
Hej,
> Følgende er fuldstændig utestet, og skrevet af en halvtræt fyr der de
sidste
> par timer udelukkende har kodet Ruby, ikke PHP. :)
[SNIP SNAP SNUDE]
Nu har jeg sidder og kigget lidt på kode, men det ser ud til der går noget
galt der, hvor du deler arrayet i ip og timestamp.
Jeg gjorde før det, at jeg læste hele filen ind i et array og udnyttede at
ip'en stod først.
for($i=0; $i<count($array); $i++){
if($i%2==0){
array_push($ip, $array[$i]); // da indexet for ip'en altid vil være
lige
}
else{
array_push($timestamp, $array[$i]);
}
}
--
Best regards / Mes meilleures amitiés / Med venlig hilsen
Andreas Kryger Jensen
http://www.compose.subnet.dk
linux er godt nok.....
| |
Jonas Delfs (28-03-2002)
| Kommentar Fra : Jonas Delfs |
Dato : 28-03-02 19:05 |
|
"Andreas Kryger Jensen" <xylofonius@hotpop.com> skrev i en meddelelse
news:a7t8pu$l83$1@sunsite.dk...
> > Følgende er fuldstændig utestet, og skrevet af en halvtræt fyr der de
> sidste
> > par timer udelukkende har kodet Ruby, ikke PHP. :)
> [SNIP SNAP SNUDE]
>
> Nu har jeg sidder og kigget lidt på kode, men det ser ud til der går noget
> galt der, hvor du deler arrayet i ip og timestamp.
>
> Jeg gjorde før det, at jeg læste hele filen ind i et array og udnyttede at
> ip'en stod først.
[snip]
Jeg er lidt i tvivl - lægger du op til jeg skal prøve at undersøge sagen,
eller har du måske selv fundet en løsning?
--
Mvh./Best Regards
Jonas Delfs, http://delfs.dk
| |
Andreas Kryger Jense~ (28-03-2002)
| Kommentar Fra : Andreas Kryger Jense~ |
Dato : 28-03-02 23:09 |
|
> Jeg er lidt i tvivl - lægger du op til jeg skal prøve at undersøge sagen,
> eller har du måske selv fundet en løsning?
Tja, jeg sidder og grubler over sagen, men hvis du har svaret lige på
tungen, skal jeg da
ikke være til hindring. :)
--
Best regards / Med venlig hilsen
Andreas Kryger Jensen
http://www.xylo.myip.org
| |
Jonas Delfs (28-03-2002)
| Kommentar Fra : Jonas Delfs |
Dato : 28-03-02 23:41 |
|
"Andreas Kryger Jensen" <xylofonius@hotpop.com> skrev i en meddelelse
news:a804ak$9fv$1@sunsite.dk...
> > Jeg er lidt i tvivl - lægger du op til jeg skal prøve at undersøge
sagen,
> > eller har du måske selv fundet en løsning?
> Tja, jeg sidder og grubler over sagen, men hvis du har svaret lige på
> tungen, skal jeg da
> ikke være til hindring. :)
Det er jeg ikke sikker på at jeg har, men prøv denne: (2 mindre rettelser
foretaget)
function tjek_ip() {
$nu = time();
$igaar = $nu - (3600*24);
$file = file('fil.txt');
for($i=0; $i < count($file); $i++) {
list($ip, $timestamp) = explode('-', $file[$i]);
if ($timestamp < $nu && $timestamp > $igaar) {
if ($list[$ip] >= 3) {
return false;
}
if ($ip == $GLOBALS['REMOTE_ADDR']) {
$list[$ip]++;
}
}
}
return true;
}
--
Mvh./Best Regards
Jonas Delfs, http://delfs.dk
| |
Andreas Kryger Jense~ (30-03-2002)
| Kommentar Fra : Andreas Kryger Jense~ |
Dato : 30-03-02 06:38 |
|
Hej Jonas,
Så er den dæleme hjemme. Det virker! :)
> if ($list[$ip] >= 3) {
Skulle dog lige ændres til:
if ($list[$ip] >= 2) {, men ellers var det PERFEKT!
Tusind tak for hjælpen. Du har reddet min dag og ugen med :)
--
Best regards / Mes meilleures amitiés / Med venlig hilsen
Andreas Kryger Jensen
http://xylo.myip.org
Unix is user friendly, its just very selective of who its friends are.
| |
|
|