Avatar billede moddi100 Seniormester
03. februar 2008 - 20:10 Der er 18 kommentarer og
1 løsning

Tilføje en permanent værdi til array

Hej Eksperter

Jeg har et array hvori jeg gemmer ip-adresser på dem jeg ikke vil have skal kunne se min hjemmeside. Det kan være på grund af spam i gæstebog osv.

Koden ser sådan ud:

$bannedeiper = array("xx.xx.xx.xx");


if (in_array($_SERVER['REMOTE_ADDR'],$bannediper)) {
  header("Location: ipfejl.php");
}


Hvis jeg vil tilføje en værdi skriver jeg:

$bannedeiper[] = $ip_der_skal_bannes;

$ip_der_skal_bannes er så den pågældende bruger jeg vil nægte adgang. Variablen kan f.eks. oprettes via en formular, hvor jeg indtaster ip'en, det er nu underordnet. (Det har jeg selv ordnet)

Men hvordan får jeg så den til at gemme ip'en i arrayet permanent?
Således at jeg kan indtaste en ny ip, og så er den gemt i arrayet sammen med de andre?

Mvh. Morten
Avatar billede nielle Nybegynder
03. februar 2008 - 20:19 #1
Du har to muligheder:

1) du definere arrayet i en PHP fil som du includer de steder hvor du har brug for den. Så kan du nøjes med at opdatere denne ene fil og uploade den hver gang du vil banne nogen.

2) Du opretter en tabel til formålet i din database. Så kan du altid udtrække værdierne derfra for hver besøgende.

Metode 2 belaster databasen for hvert besøg, så den første er nok at foretrække. Den er dog mindre fleksibel da den kræver at du har mulighed for FTP når du vil banne en  ny person, mens database metoden kan klares fra en browser.
Avatar billede moddi100 Seniormester
03. februar 2008 - 20:31 #2
Med hensyn til løsning 1), så ved jeg godt at jeg kan gøre det sådan. Men som du selv siger kræver det FTP adgang.

Det du vil have i løsning 2), er vel at jeg i stedet for et array bruger en tabel? Det er ikke det jeg er interesseret i... :D

Er det overhovedet ikke muligt, at jeg kan, via en eller anden stump kode i retning af

$ip_der_skal_bannes = $_POST['ip']
$bannedeiper[] = $ip_der_skal_bannes;

tilføje en værdi/ip permanent til arrayet?
Avatar billede nielle Nybegynder
03. februar 2008 - 20:37 #3
Ikke på nogen simpel måde.

Du kunne måske lave noget over en CMS model ...

Eller du kunne kan lave en lsøning hvor du uploader via en form - stedet for FTP ...

Eller du kunne lave noget hvor at du vha. eval() ...

Eller du kan lave noget hvor at du skriver til en PHP fil vha. fwrite():

http://dk2.php.net/manual/en/function.fwrite.php
Avatar billede nielle Nybegynder
03. februar 2008 - 20:38 #4
Du skal dog være heeelt sikker på at det er sådan du vil have det, for du åbner jo for at en hacker-type potentielt kan lægge skadelig PHP kode op i stedet for det formål du havde tiltænkt løsningen til.
Avatar billede moddi100 Seniormester
03. februar 2008 - 20:39 #5
hvis jeg bruger fwrite, hvordan kan jeg så placerer ip'en inde i arrayet?
Avatar billede nielle Nybegynder
03. februar 2008 - 20:45 #6
Du skal åbne filen, læse alt indholdet, modificere det (ved at indsætte det nye ip på den rette plads) og så skrive det hele ud igen.

Som sagt er det ikke specielt simpelt.
Avatar billede moddi100 Seniormester
03. februar 2008 - 20:54 #7
Det er lige det med at modificerer det jeg ikke ved hvordan man gør...
Avatar billede nielle Nybegynder
03. februar 2008 - 21:04 #8
Det kan regexp f.eks. gøre:

$fileName = "dinPhpFil.php";

// Læs filens indhold
$handle = fopen($fileName, "r");
$content = fread($handle, filesize($fileName));
fclose($handle);

// Modificer
$ip_der_skal_bannes = $_POST['ip'];
$content = preg_replace("/)/", "$ip_der_skal_bannes)", $content);

// Udskriv modificeret indhold.
$handle = fopen($fileName, "w");
fwrite($handle, $content);
fclose($handle);
Avatar billede moddi100 Seniormester
03. februar 2008 - 21:06 #9
Det prøver jeg lige, 2 min.
Avatar billede nielle Nybegynder
03. februar 2008 - 21:09 #10
Du skal lige rette til:

$content = preg_replace("/)/", ", '$ip_der_skal_bannes')", $content);
Avatar billede moddi100 Seniormester
03. februar 2008 - 21:15 #11
ja det ser mere rigtigt ud, men hvorfor skal det se sådan ud "/)/"
i stedet for sådan: ")"
Avatar billede moddi100 Seniormester
03. februar 2008 - 21:21 #12
Jeg får fejlen:

Warning: preg_replace() [function.preg-replace]: Compilation failed: unmatched parentheses at offset 0 in /web/ban.php on line 38
Avatar billede nielle Nybegynder
03. februar 2008 - 21:21 #13
preg_xxxx() funktionerne kræver at der er noget som angiver start og slutning. Der er for at man så kan anbriunge nogle modifiere bagefter:

$content = preg_replace("/)/i", ", '$ip_der_skal_bannes')", $content);

Nu skelner den f.eks. ikke imellem store og små bogstaver mere - ikke sp relevant i lige dette tilfælde.

Kort sagt: Sådan er syntaksen altså. Det er noget PHP har arvet fra Perl.
Avatar billede nielle Nybegynder
03. februar 2008 - 21:22 #14
Selvfølgelig...

Ret til:

$content = preg_replace("/\)/i", ", '$ip_der_skal_bannes')", $content);
Avatar billede moddi100 Seniormester
03. februar 2008 - 21:27 #15
så virker det :D
Jeg tester lige om det virker når jeg includer arrayet i de andre filer...
Avatar billede moddi100 Seniormester
03. februar 2008 - 21:30 #16
Du har hermed vundet 60 point. Smid lige et svar.
Avatar billede nielle Nybegynder
03. februar 2008 - 21:51 #17
Hvis du ellers er intesseret i at forstå, hvad der egentlig sker i den der preg_replace(), kan jeg nævne at jeg har skrevet et par artikler om emnet her på Eksperten:

http://www.eksperten.dk/artikler/1156
Avatar billede moddi100 Seniormester
05. februar 2008 - 14:13 #18
det vil jeg nok kigge nærmere på i den nærmeste fremtid :D
Avatar billede moddi100 Seniormester
05. februar 2008 - 14:14 #19
skulle tilsyneladende lige have trykket accept først :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester