Jnnbo: PHP Weiterleitung

Moin,

ich möchte gerne nochmals auf einen Fehler von mir zu sprechen kommen.

$host = $_SERVER["HTTP_HOST"];
$uri  = rtrim(dirname(htmlspecialchars($_SERVER["PHP_SELF"])), "/\\");

$extra = "produkte";

if(isset($_GET["delete"])){

	$delete = $_GET["delete"];
	$stmt = $mysqli->prepare("DELETE FROM web_produkte WHERE wk_wkID=?");
	$stmt->bind_param("s",  $delete);
	$stmt->execute();
	$stmt->close();
	
	header("Location: http://$host$uri/$extra");
}

Zu mir wurde gesagt das "rtrim(dirname(htmlspecialchars" kann komplett weg, dieses ist in einer URL nicht wichtig, habe ich das richtig verstanden? Ich räume gerade mein Code bisschen auf.

Außerdem wurde gesagt eine header Weiterleitung benötigt eine absolut URL, ist dieses so richtig, wie ich es oben geschrieben habe?

  1. Tach,

    $uri = rtrim(dirname(htmlspecialchars($_SERVER["PHP_SELF"])), "/\");

    header("Location: http://$host$uri/$extra");

    Zu mir wurde gesagt das "rtrim(dirname(htmlspecialchars" kann komplett weg, dieses ist in einer URL nicht wichtig

    htmlspecialchars() bereitet Text so auf, dass es in HTML-Code keinen Ärger mit den HTML-Sonderzeichen <, >, & und Anführungszeichen gibt. Du verwendest $uri aber nicht HTML-, sondern HTTP-seitig. htmlspecialchars() ist hier fehl am Platze.

    Der Rückstrich, den du mit rtrim() entfernen möchtest, hat in URLs nichts zu suchen, das ist eine DOS/Windows-Angelegenheit. Falls du das Skript allerdings auf einem Windows-System ausführst, könnte es sein, dass du sämtliche Rückstriche durch Schrägstriche ersetzen musst. Das funktioniert mit rtrim() natürlich nicht. Weiterhin ist es unnötig, den letzten Schrägstrich zu entfernen, weil du ihn bei header(... $uri/$extra) eh wieder einfügst. rtrim() ist also überflüssig, falls überhaupt, bräuchtest du strtr(), aber nur unter Windows.

    dirname() brauchst du trotzdem in diesem Zusammenhang, denn du möchtest anscheinend nicht auf das Skript weiterleiten, sondern wo immer $extra hinzeigt.

    Außerdem wurde gesagt eine header-Weiterleitung benötigt eine absolute URL, ist dieses so richtig, wie ich es oben geschrieben habe?

    Falls du der Meinung bist, damit eine absolute Adresse gebastelt zu haben: Ja. (Falls du nicht weisst, was eine absolute Adresse ist, solltest du das besser selbst nachschlagen. Sowas ist Grundwissen.)

  2. Liebe(r) Jnnbo,

    ich sehe da zwei Möglichkeiten, Deinen Code zu vereinfachen.

    $host = $_SERVER["HTTP_HOST"];
    $uri  = rtrim(dirname(htmlspecialchars($_SERVER["PHP_SELF"])), "/\\");
    
    $extra = "produkte"; [...]
    
    	header("Location: http://$host$uri/$extra");
    }
    

    Du willst, dass an eine Adresse mit dem Zusatz "/produkte" weitergeleitet wird, stimmt's? Wozu muss die Zeichenkette "produkte" da in eine eigene Variable? Das geht kürzer! Außerdem sollten GET-Requests keine Daten ändern (es sei denn, Du willst was tracken/protokollieren), daher verwende lieber POST-Requests. Vielleicht willst Du auch das "http" variabel gestalten, damit später auch "https"-Aufrufe möglich sind? Dann ist im Prinzip nur noch der (absolute) Pfad wichtig, der Servername und das Protokoll nicht mehr. Insgesamt benötigst Du wohl das hier:

    $uri      = $_SERVER['REQUEST_URI']; // wozu hier eigentlich doppelte Anführungszeichen?
    
    $uri = preg_replace('~(\?|\#).*~', '', $uri); // URL-Parameter und Anker entfernen
    $uri = preg_replace('~/*$~', '/produkte', $uri); // auf Produkte-Unterseite zeigen
    
    // REST-kompatible APIs verändern mit GET-Aufrufen keine Daten, daher hier $_POST!
    if (array_key_exists('delete', $_POST)) {
    
        // Löschung vornehmen
        $stmt = $mysqli->prepare("DELETE FROM web_produkte WHERE wk_wkID=?");
        $stmt->bind_param("s",  $_POST['delete']);
        $stmt->execute();
        $stmt->close();
    
        // weiterleiten
        header("Location: $uri");
    }
    

    Zu mir wurde gesagt das "rtrim(dirname(htmlspecialchars" kann komplett weg, dieses ist in einer URL nicht wichtig, habe ich das richtig verstanden? Ich räume gerade mein Code bisschen auf.

    Wozu sollten denn Protokoll und Hostname relevant sein? Und auf welchen Pfad willst Du hier reagieren? Es soll doch wohl immer wieder dasselbe PHP-Script aufgerufen werden, welches sich dann im Zweifel den Pfad sowieso in seine Einzelteile zerlegt, um dann passend zu antworten. Also genügt uns doch alles nach dem Domain-Namen, beginnend mit dem Wurzelverzeichnis-Slash.

    Außerdem wurde gesagt eine header Weiterleitung benötigt eine absolut URL, ist dieses so richtig, wie ich es oben geschrieben habe?

    Lies bitte tatsächlich noch einmal genau nach, was eine absolute URL ist. Du schmeißt da ein paar Sachen in einen Topf, die nicht wirklich zusammen da hinein gehören. Also. Für Dich. Eine klitzekleine Selbst-Test-Aufgabe:

    Welche der folgenden Adressen ist eine "absolute" URL?

    • ../pics/img.gif
    • /site/forum/view.php
    • //www.example.org
    • https://example.org

    Liebe Grüße,

    Felix Riesterer.

    1. Hallo Felix,

      Welche der folgenden Adressen ist eine "absolute" URL?

      • ../pics/img.gif
      • /site/forum/view.php
      • //www.example.org
      • https://example.org

      wenn ich es richtig verstanden habe, was mir in diversen Videos immer wieder erzählt wird, dann die letzten beiden. Die // bedeuten, es kann http oder https stehen. Richtig?

      1. Liebe(r) Jnnbo,

        wenn ich es richtig verstanden habe, was mir in diversen Videos immer wieder erzählt wird,

        sind denn Videos die beste und zuverlässigste Quelle für technische Fakten?

        dann die letzten beiden. Die // bedeuten, es kann http oder https stehen. Richtig?

        Du musst die Basics lernen! [Wikipedia zu URL]

        Liebe Grüße,

        Felix Riesterer.

        1. Hallo Felix,

          dann die letzten beiden. Die // bedeuten, es kann http oder https stehen. Richtig? Du musst die Basics lernen! [Wikipedia zu URL]

          also wenn ich mir die Beispiele in deinem Link anschaue, dann finde ich genau das gleiche, was ich zu den // geschrieben habe:

          // Gleiches Protokoll sinnvoll, um http: oder https: der momentanen Umgebung zu verwenden

          1. Liebe(r) Jnnbo,

            und was ist mit den ersten beiden URL-Beispielen...?

            Liebe Grüße,

            Felix Riesterer.