Php URL ändern wie href?
Hallo,
Ich habe ein System entwickelt, welches bei Knopfdruck in die URL?aktion=clear_log ausführt. Allerdings wird nach der Seite immer wieder die URL geöffnet und meine Frage ist, ob ich IN PHP irgendwie das ?aktion.... wieder raus nehmen kann.
Also:
URL Test.de
Knopfdruck: Test.de?aktion=clear_log
Bei Neuladen der Seite wird die Datei immer weiter gelöscht. Solle es aber nicht.
Nach dem löschen der Datei soll das ganze wieder Test.de heißen, also für 1 sek steht die URL Test.de?... und danach wieder Test.de
Bitte in PHP ohne htaccess ein Code BSP b.z.w ein Code Schnipsel senden
Danke
Der Quellcode:
<?PHP
$file = "ip_log.txt";
$ip = $_SERVER['REMOTE_ADDR'];
$time = time();
$content = @file_get_contents($file);
$new_content = $ip." = ".$time;
$content .= $new_content."\r\n";
@file_put_contents($file,$content);
$users = @parse_ini_file($file);
$count = 0;
foreach($users as $ip=>$time){
if($time >= time() - 1){
$count++;
}
}
?>
<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="UTF-8">
<title> IP TOOLS | UCP LuGaming</title>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.css">
<meta name="viewport" content="width=device-width">
<style type="text/css">
body{ font: 14px sans-serif; text-align: center; }
</style>
<div class="page-header">
<h1>IP Tools</h1>
</div>
</head>
<body>
<div id="ip">
<iframe src="ip_log.txt" width="100%" height="100%" frameborder="2%"></iframe>
</div>
<br><a href="?aktion=clear_log" class="btn btn-danger">LOG leeren</a>
<style>
#ip {
position: relative;
top: -20px;
left: 0%;
}
</style>
<div id="user_online">
Es sind <?php echo $count ?> IP Adressen, am <?php echo(date("d m Y",$time)) ?> um <?php echo(date("H:i:s",$time)) ?> Uhr Online.
</div>
</body>
<br><a href="admin.php" class="btn btn-danger">Zurück</a>
</html>
<?php
$fileArray = array();
foreach (glob("./ip_log.txt") as $filename) {
$diff = time() - fileatime($filename); // fileatime liefert den Unixtimestamp des letzten Zugriffs auf eine Datei
if($diff > 3600) // 3600 = 60 sec * 60 min
{
unlink($filename);
}
}
?>
<?php
$fileArray = array();
foreach (glob("./ip_log.txt") as $filename) {
$diff = time() - fileatime($filename);
if (isset($_GET['aktion']) and $_GET['aktion']=='clear_log') {
unlink($filename);
unset($_GET["clear_log"]);
}
exit;
}
?>
//Created by LuGaming
//Klaut diesen Code nicht, es stecken 12 Stunden Arbeit drinne
4 Antworten
![](https://images.gutefrage.net/media/default/user/9_nmmslarge.png?v=1551279448000)
Dann leite noch nach Verarbeitung des Requests den Nutzer wieder auf die Startseite weiter.
header("Location: https://www.example.com");
![](https://images.gutefrage.net/media/default/user/9_nmmslarge.png?v=1551279448000)
Das bezweifle ich. Wenn dann steht dort "Header already sent". D.h. du hast vor der header()-Funktion irgendeine andere Ausgabe. Da Du uns deinen Quellcode nicht genannt hast, kann man das nicht mal erahnen. Daher kann man deine Frage auch nicht genauer beantworten.
![](https://images.gutefrage.net/media/default/user/8_nmmslarge.png?v=1551279448000)
Bitte klaut den Code nicht, Ich saß da fast 12 Std dran
<?PHP
$file = "ip_log.txt";
$ip = $_SERVER['REMOTE_ADDR'];
$time = time();
$content = @file_get_contents($file);
$new_content = $ip." = ".$time;
$content .= $new_content."\r\n";
@file_put_contents($file,$content);
$users = @parse_ini_file($file);
$count = 0;
foreach($users as $ip=>$time){
if($time >= time() - 1){
$count++;
}
}
?>
<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="UTF-8">
<title> IP TOOLS | UCP LuGaming</title>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.css">
<meta name="viewport" content="width=device-width">
<style type="text/css">
body{ font: 14px sans-serif; text-align: center; }
</style>
<div class="page-header">
<h1>IP Tools</h1>
</div>
</head>
<body>
<div id="ip">
<iframe src="ip_log.txt" width="100%" height="100%" frameborder="2%"></iframe>
</div>
<br><a href="?aktion=clear_log" class="btn btn-danger">LOG leeren</a>
<style>
#ip {
position: relative;
top: -20px;
left: 0%;
}
</style>
<div id="user_online">
Es sind <?php echo $count ?> IP Adressen, am <?php echo(date("d m Y",$time)) ?> um <?php echo(date("H:i:s",$time)) ?> Uhr Online.
</div>
</body>
<br><a href="admin.php" class="btn btn-danger">Zurück</a>
</html>
<?php
$fileArray = array();
foreach (glob("./ip_log.txt") as $filename) {
$diff = time() - fileatime($filename); // fileatime liefert den Unixtimestamp des letzten Zugriffs auf eine Datei
if($diff > 3600) // 3600 = 60 sec * 60 min
{
unlink($filename);
}
}
?>
<?php
$fileArray = array();
foreach (glob("./ip_log.txt") as $filename) {
$diff = time() - fileatime($filename);
if (isset($_GET['aktion']) and $_GET['aktion']=='clear_log') {
unlink($filename);
unset($_GET["clear_log"]);
}
exit;
}
?>
![](https://images.gutefrage.net/media/default/user/9_nmmslarge.png?v=1551279448000)
Du müsstest die Prüfung, ob aktion als Parameter mitgeschickt wurde am Anfang des Quellcodes einfügen, nicht am Ende. Dann würde die von mir vorgeschlagene header()-Funktion auch funktionieren.
![](https://images.gutefrage.net/media/default/user/8_nmmslarge.png?v=1551279448000)
![](https://images.gutefrage.net/media/user/regex9/1455660989427_nmmslarge__0_13_270_270_615d5a3bc6888f4c1486ce2b4d9d8f60.png?v=1455660989000)
Das sollten wir jetzt wohl auch als Antwort schreiben: Bitte klaue unsere Lösungsvorschläge nicht, wir saßen da X Minuten dran. 😒
Deine Fehler beginnen schon beim Markup.
- Ein div gehört nicht in den head (sondern in den body) und die Zeile nach dem schließenden body-Element müsste dadrüber. Verschiebe außerdem alle Styles in das eine style-Element im head.
- Die Attribute width und height dürfen keine Einheitsangaben bekommen. Setze die Ausmaße stattdessen via CSS, dann darfst du % verwenden. Wirf bei der Gelegenheit das frameborder-Attribut raus und setze den Rahmen stattdessen ebenfalls via CSS (border).
Deine PHP-Blöcke solltest du alle nach oben schieben. Dann würde auch der exit-Aufruf am Ende Sinn machen. Wo du die header-Funktion aufrufst, habe ich noch nicht entdeckt. Aber in der Theorie wäre es hinter diesen beiden Zeilen:
unlink($filename);
unset($_GET["clear_log"]);
// header ...
exit;
Das funktioniert aber nur, wenn die PHP-Blöcke noch vor dem Doctype stehen.
![](https://images.gutefrage.net/media/default/user/11_nmmslarge.png?v=1551279448000)
Du kannst es per $_POST Methode lösen und dies danach automatisch löschen. Sprich nachdem du es einmal verarbeitet hast, setze den Wert auf 0 und damit hat sich das dann.
if (isset($_POST["clear_log"]) && $_POST["clear_log"]==1) {
unset($_POST["clear_log"]);
// Code ausführen
}
![](https://images.gutefrage.net/media/default/user/11_nmmslarge.png?v=1551279448000)
Würde alternativ auch mit $_GET gehen, da du in deinem Beispiel ja mit diesem arbeitest. Also statt $_POST dann eben $_GET
![](https://images.gutefrage.net/media/default/user/13_nmmslarge.png?v=1551279448000)
![](https://images.gutefrage.net/media/user/Functional/1676159504902_nmmslarge__0_0_960_960_e2ac34e1b18f19102f515d8e9bd9a8ba.jpg?v=1676159505000)
Das geht mittels dem Location-Header.
Allerdings nur, wenn du zuvor keine Ausgabe (z.B. HTML) verursacht hast. Beispiel:
//Funktioniert NICHT
<html>
<body>
Hallo Welt
<?php
if($soundso) header('Location: test.de');
?>
</body>
</html>
//Funktioniert
<?php
if($soundso) header('Location: test.de');
?>
<html>
<body>
Hallo Welt
</body>
</html>
Notfalls könnte man noch mittels JavaScript redirecten. Sprich, am Ende der Seite mittels PHP einfach ein JavaScript Skript ausgeben, Beispiel:
<html>
<body>
Hallo Welt
</body>
</html>
<?php
if($soundso) echo '<script>location.href = "test.de";</script>';
?>
Das geht aber natürlich nur, wenn JavaScript im Browser aktiviert ist.
![](https://images.gutefrage.net/media/user/regex9/1455660989427_nmmslarge__0_13_270_270_615d5a3bc6888f4c1486ce2b4d9d8f60.png?v=1455660989000)
1) Dem Aufruf der header-Funktion sollte der Aufruf von exit folgen, um sich eine weitere Ausführung des Skripts zu ersparen.
2) Die letzte Variante wäre inkorrektes Markup. Es spricht nichts dagegen, das script-Element an der richtigen Stelle (im body oder head) zu rendern.
![](https://images.gutefrage.net/media/user/Functional/1676159504902_nmmslarge__0_0_960_960_e2ac34e1b18f19102f515d8e9bd9a8ba.jpg?v=1676159505000)
![](https://images.gutefrage.net/media/user/Vorstandsgerd/1525448490152_nmmslarge__38_39_686_686_0b2b1d0b2804c200b32460e0a1233471.png?v=1525448492000)
Dann musst du die Operation idempotent machen
![](https://images.gutefrage.net/media/default/user/8_nmmslarge.png?v=1551279448000)
Dann steht dort header alwasy sent