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
Dann leite noch nach Verarbeitung des Requests den Nutzer wieder auf die Startseite weiter.
header("Location: https://www.example.com");
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.
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;
}
?>
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.
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.
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
}
Würde alternativ auch mit $_GET gehen, da du in deinem Beispiel ja mit diesem arbeitest. Also statt $_POST dann eben $_GET
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.
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.
Dann musst du die Operation idempotent machen
Dann steht dort header alwasy sent