PHP Script vor href ausführen?
Also z.B.
<?php
<button name="test">Das ist ein Knopf</button>
if(isset($_POST["test"])) {
}
(habe ich jetzt extra kurz gehalten)
Wie kann ich es jetzt so machen, das erst das
if(isset($_POST["test"])) {
ausgeführt wird und man dann automatisch auf google.com weiter geleitet wird?
In den
if(isset($_POST["test"])) {
ist ein INSERT statement, es soll ausgeführt werden und dannach soll direkt der User auf google.com weitergeleitet werden.
Mit dem <a> Tag lässt sich sowas nicht umsetzen, weil man direkt weitergeleitet wird, bevor die Funktion ausgeführt wird.
2 Antworten
<a href="?run">Hier klicken</a>
<?php
if(isset($_GET['run'])) {
//das hier wird ausgeführt, wenn man klickt
header("Location: https://google.de");
}
Der Button in deinem Beispiel wird ohne ein Form Element nicht funktionieren. Achte auf ein vollständiges HTML-Gerüst und vor dem header Befehl darf nichts mit echo oder irgendwie anders etwas ausgegeben werden.
Pass auf, dass dein Code nicht für SQL-Injections angreifbar ist. (Keine direkten SQL-Querystrings oder Teile davon in User variablen verwenden!!!)
Außerdem ist die Weiterleitung gar nicht im IF-Block und würde immer aufgerufen werden.
Ich habe in meiner Antwort geschrieben, das vor dem Header nix kommen darf. Es soll sowiso nur SQL ausgeführt werden.
Der header befehl ist im If-Block und wird auch nur dann ausgeführt.
im Code vom Fragesteller existiert kein Header-Befehl oder bin ich blind?
Er hat dir geantwortet und in dem Code ist header nach dem IF-Block.
<form method="post">
<input type="submit" value="Hallo" name="start">
</form>
<?php
if(isset($_POST["start"])) {
$statement = $pdo->prepare("INSERT xyz");
$user = $statement->fetch();
(nicht alles)
}
header("Location: https://google.de");
?>
Dein Skript sollte so aussehen:
<?php
if (isset($_POST["start"])) {
// SQL insert, etc. ...
header("Location: https://google.de");
exit;
}
?>
<!doctype html>
<head>
<!-- title, etc. -->
</head>
<body>
<form method="post">
<input name="start" type="submit" value="Hallo">
</form>
</body>
1) Zum einen wird, wie hier nun schon mehrmals erwähnt, der Response Header gesetzt, bevor der Response Body geschrieben wird.
Bei der Ausführung deines PHP-Skripts wird intern ein Response-Objekt angelegt, welches aus einem Header und einem Body besteht. In den Header kommen allgemeine Informationen (z.B. der MIME-Typ, der dem Browser Auskunft gibt, ob es sich hier z.B. um HTML-/Plaintext/JSON/ein Bildformat, o.ä. handelt). Im Body steht das zusammengebaute HTML-Dokument.
Mit der ersten Ausgabe in deinem Skript (also HTML, Ausgaben mit echo/print/...) wird intern das Schreiben des Response Header abgeschlossen. Er kann danach nicht mehr verändert werden. Wenn deine header-Funktion (die den Response Header aktiv beschreibt) also nach einer Ausgabe ausgeführt wird, wird sie vor eine verschlossene Tür prallen.
2) Damit die Weiterleitung nicht bei jedem Request (egal ob via GET/POST/...) an die Seite erfolgt, sollte der header-Aufruf im if-Block stehen.
3) Nach einer Weiterleitung solltest du stets den exit-Befehl aufrufen. Dieser beendet die Ausführung des PHP-Skripts. Es muss ja nicht weiter im Hintergrund verarbeitet werden, wenn der Nutzer eh auf eine andere Seite kommt.
Denk doch einfach mal in Ruhe über dein Problem nach und versuche logisch nachzuvollziehen, was da passiert und was man dafür programmieren muss.
Für deinen Fall sähe das in etwa so aus:
<?php
if (isset($_POST["start"])) {
$statement = $pdo->prepare("INSERT xyz");
…
header("Location: https://www.google.com/");
} else {
?>
<html>
…
<form method="post">
<input type="submit" value="Hallo" name="start">
</form>
…
<?php
}
?>
Wie schon von showgirl1 geschrieben, darf vor header noch keinerlei Ausgabe erfolgt sein. Entweder machst du es also so wie oben von mir geschrieben oder du arbeitest mit Ausgabepufferung:
<?php // Anfang vom Script
ob_start();
?>
<html>
… HTML, PHP, egal
</html>
<?php
ob_end_flush();
?>
@MrCommandBlock Vor header Anweisungen darf keine Ausgabe erfolgen!