Limiteren resultaten if-statement
Goedemiddag!
Ik ben met een klein projectje bezig, maar kom er even niet uit.
Het wordt een simpel logsysteem, waar je vanuit het admin panel de logs kunt bekijken. Hier worden ook IP-adressen bijgehouden, die je vanuit de logs meteen kunt blokkeren.
Op dit moment zit ik even in de knoei met het volgende:
In de logs kan een IP-adres meerdere keren voorkomen. Ik ga ervoor zorgen dat een IP-adres maar 1x per dag wordt gelogd om het overzichtelijk te houden. Maar met de volgende code wordt een IP-adres zo vaak geblokkeerd als deze in de logs voorkomt, en dat moet natuurlijk maar 1x zijn.
Ik heb zelf al heel wat afgezocht, maar kan het niet vinden.
Het probleem zit in de while en het feit dat de if-statement meerdere resultaten heeft/kan hebben. Uit de var_dump komt een opsomming van arrays naar voren.
In de logs wordt het als volgt opgeslagen:
logs.txt
ips.txt (geblokkeerde IP-adressen)
Ik ben met een klein projectje bezig, maar kom er even niet uit.
Het wordt een simpel logsysteem, waar je vanuit het admin panel de logs kunt bekijken. Hier worden ook IP-adressen bijgehouden, die je vanuit de logs meteen kunt blokkeren.
Op dit moment zit ik even in de knoei met het volgende:
In de logs kan een IP-adres meerdere keren voorkomen. Ik ga ervoor zorgen dat een IP-adres maar 1x per dag wordt gelogd om het overzichtelijk te houden. Maar met de volgende code wordt een IP-adres zo vaak geblokkeerd als deze in de logs voorkomt, en dat moet natuurlijk maar 1x zijn.
Ik heb zelf al heel wat afgezocht, maar kan het niet vinden.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php
session_start();
if($_SERVER['REQUEST_METHOD'] === 'POST'):
require_once('../../config.php');
$open = fopen("../../".$conf_file_logs, 'r');
while(!feof($open)): // <-- laadt alle rijen uit het logbestand (.txt)
$file = fgets($open);
$fileLine = explode('|', $file);
if($fileLine[1] == 'IP' && $fileLine[2] == $_POST['inputIp']): // <-- checkt het type log en kijkt of het IP-adres overeenkomt met de invoer van de beheerder, dit kan dus meerdere keren voorkomen
$array = array($_POST['inputIp'], $_POST['inputReason']);
newLine($array, "../../".$conf_file_ips);
header("Location: ../admin.php?IPCenter");
endif;
endwhile;
endif;
?>
session_start();
if($_SERVER['REQUEST_METHOD'] === 'POST'):
require_once('../../config.php');
$open = fopen("../../".$conf_file_logs, 'r');
while(!feof($open)): // <-- laadt alle rijen uit het logbestand (.txt)
$file = fgets($open);
$fileLine = explode('|', $file);
if($fileLine[1] == 'IP' && $fileLine[2] == $_POST['inputIp']): // <-- checkt het type log en kijkt of het IP-adres overeenkomt met de invoer van de beheerder, dit kan dus meerdere keren voorkomen
$array = array($_POST['inputIp'], $_POST['inputReason']);
newLine($array, "../../".$conf_file_ips);
header("Location: ../admin.php?IPCenter");
endif;
endwhile;
endif;
?>
Het probleem zit in de while en het feit dat de if-statement meerdere resultaten heeft/kan hebben. Uit de var_dump komt een opsomming van arrays naar voren.
In de logs wordt het als volgt opgeslagen:
logs.txt
ips.txt (geblokkeerde IP-adressen)
Gewijzigd op 12/04/2017 15:57:50 door Mario Achternaam
Wat is de reden dat je geen database gebruikt? Het maakt het stukken makkelijker om mee te werken.
Verder hoort er eigenlijk een exit(); na je location-header.
Verder hoort er eigenlijk een exit(); na je location-header.
Ik vind het wel leuk om mezelf soms uit te dagen en zonder database te werken. Voor het ene project doe ik het wel en het andere niet :)
Is dat zo? Dat heb ik nooit geweten, zal er rekening mee houden.
Is dat zo? Dat heb ik nooit geweten, zal er rekening mee houden.
- Ariën - op 12/04/2017 16:04:42:
Verder hoort er eigenlijk een exit(); na je location-header.
Eigenlijk moet dat altijd, en wel om de volgende reden.
Bedankt.
Jullie kunnen me niet helpen met m'n uitdaging?
Jullie kunnen me niet helpen met m'n uitdaging?
Zo te zien heb je niet echt een probleem, want let op:
>> In de logs kan een IP-adres meerdere keren voorkomen. Ik ga ervoor zorgen dat een IP-adres maar 1x per dag wordt gelogd om het overzichtelijk te houden. Maar met de volgende code wordt een IP-adres zo vaak geblokkeerd als deze in de logs voorkomt, en dat moet natuurlijk maar 1x zijn.
Nee, je code wijzigt alleen de eerste keer dat het voorkomt, je redirect immers direct daarna. Als je je exit gewoon netjes na de header plaatst zoals het hoort te zijn ben je al klaar.
Kortom, geen probleem, hooguit niet erg netjes.
>> In de logs kan een IP-adres meerdere keren voorkomen. Ik ga ervoor zorgen dat een IP-adres maar 1x per dag wordt gelogd om het overzichtelijk te houden. Maar met de volgende code wordt een IP-adres zo vaak geblokkeerd als deze in de logs voorkomt, en dat moet natuurlijk maar 1x zijn.
Nee, je code wijzigt alleen de eerste keer dat het voorkomt, je redirect immers direct daarna. Als je je exit gewoon netjes na de header plaatst zoals het hoort te zijn ben je al klaar.
Kortom, geen probleem, hooguit niet erg netjes.
Yes, werkt, dankjewel!
Toevoeging op 14/04/2017 23:01:17:
Ben, zou je me trouwens nog kunnen uitleggen wat er niet netjes is?
Toevoeging op 14/04/2017 23:03:22:
Dit is de code nu:
Toevoeging op 14/04/2017 23:01:17:
Ben, zou je me trouwens nog kunnen uitleggen wat er niet netjes is?
Toevoeging op 14/04/2017 23:03:22:
Dit is de code nu:
Gewijzigd op 15/04/2017 21:39:44 door Mario Achternaam
Simpel, het deel dat niet netjes is is het redirecten gebruiken als eindconditie. Een break was mogelijk netter geweest om nadat alles klaar was te redirecten. Is overigens grotendeels een kwestie van smaak, en je nieuwe code heeft dit probleem niet. Ik zou voor de leesbaarheid echter wel afstappen van endif, endwhile etc en gewoon gebruik maken van {}. Dan zie je een stuk beter wat je code aan het doen is. De vorm die je nu gebruikt is vooral geschikt voor een grote if met een lading HTML ertussen bijvoorbeeld.
Dankjewel voor je feedback.
Ik heb op jullie aanraden de redirect in een functie gezet, die eindigt met exit;. Ook heb ik alle functies in een class gezet, dat vind ik ook wat fijner werken.
Normaal gesproken gebruikte ik altijd {}, het is pas sinds een paar dagen dat ik dit een beetje aan het toepassen ben omdat ik het mooier vind als de code zo kort mogelijk is.
Nog even een vraagje trouwens:
Na het deleten van een rij wordt er een lege rij in het tekstbestand achtergelaten, wat een isset warning veroorzaakt. Ik kan natuurlijk in de code met isset controleren of een rij al dan niet leeg is, maar ik wil eigenlijk dat lege rijen helemaal niet voorkomen in het tekstbestand.
Voor de volledigheid zal ik de betreffende functie hieronder plaatsen:
Ik heb op jullie aanraden de redirect in een functie gezet, die eindigt met exit;. Ook heb ik alle functies in een class gezet, dat vind ik ook wat fijner werken.
Normaal gesproken gebruikte ik altijd {}, het is pas sinds een paar dagen dat ik dit een beetje aan het toepassen ben omdat ik het mooier vind als de code zo kort mogelijk is.
Nog even een vraagje trouwens:
Na het deleten van een rij wordt er een lege rij in het tekstbestand achtergelaten, wat een isset warning veroorzaakt. Ik kan natuurlijk in de code met isset controleren of een rij al dan niet leeg is, maar ik wil eigenlijk dat lege rijen helemaal niet voorkomen in het tekstbestand.
Voor de volledigheid zal ik de betreffende functie hieronder plaatsen:
Gewijzigd op 15/04/2017 21:40:07 door Mario Achternaam
Bestand inlezen, regel wissen, bestand terugschrijven.
http://stackoverflow.com/questions/7466424/how-to-remove-a-line-from-text-file-using-php-without-leaving-an-empty-line
http://stackoverflow.com/questions/7466424/how-to-remove-a-line-from-text-file-using-php-without-leaving-an-empty-line




