PHP Script vor href ausführen?

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!!!)

Woher ich das weiß:Hobby – Programmiere seit 2017 Webapplikationen

xxlolxx283 
Fragesteller
 01.09.2020, 22:57

Ich werde irgendwie nicht weiter geleitet.

0
xxlolxx283 
Fragesteller
 01.09.2020, 23:07
<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");
?>
0
regex9  02.09.2020, 05:39
@xxlolxx283

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.

0
showgirl1  02.09.2020, 04:24

@MrCommandBlock Vor header Anweisungen darf keine Ausgabe erfolgen!

1
Babelfish  02.09.2020, 09:42
@showgirl1

Außerdem ist die Weiterleitung gar nicht im IF-Block und würde immer aufgerufen werden.

0
MrCommandBlock  02.09.2020, 18:28
@showgirl1

Ich habe in meiner Antwort geschrieben, das vor dem Header nix kommen darf. Es soll sowiso nur SQL ausgeführt werden.

0

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();
?>

https://www.php.net/manual/de/ref.outcontrol.php

Woher ich das weiß:Berufserfahrung – Entwickle Webseiten seit über 25 Jahren.