Newsletter Formular in HTML-Seite integrieren

  • Ich würde davon abraten: die Seite beachtet das EVA-Prinzip nicht. Schau dir mal das Beispiel bei SELFHTML an, ganz optimal ist das (wegen dem die()) auch nicht aber definitiv besser als das bei php-kurs.

    Ok, gesagt getan und das Script übergibt zumindest die Daten weiter an die Datenbank. Aber..


    - Nach der Registrierung werde ich wieder auf eine weiße Seite mit der Fehlermeldungen bzw. Erfolgsmeldung weitergeleitet die eigentlich aus der newsletter.php stammt.

    - Sollte bei einem Fehler, die Fehlermeldung nicht direkt beim Formular angezeigt werden?

    - Oder nach einem erfolgreichen registrieren eine Weiterleitung auf die Startseite geschähen?

    - Sonderzeichen wie ', oder < und > im Eintrag werden immer noch an die db übertragen, ist das normal?

    Bildschirmfoto 2021-01-04 um 03.42.12.png


    Bildschirmfoto 2021-01-04 um 03.55.50.png


    Ich kenne deine aktuellen Dateien nicht, irgendwas "verknüpfen" musst du aber nicht: es gibt halt eine Datei in der die komplette Verarbeitung der Daten sowie das Formular steht. Vielleicht hilft die entsprechende Seite im Wiki von SELFHTML bzw. die dort verlinkte Seite bei php.de beim Verständnis.

    Es gibt auf dem Server nur 2 Dateien und einen Ordner für Bilder und css.

    Das Affenformular und die Verarbeitung der Daten sind in der index.php.

    In der newsletter.php befindet sich das prepared statement.


  • hm.. jetzt ist action=".php" aber wirklich weg.

    Ich würde lügen wenn ich das Gegenteil behaupten würde. Das habe ich schon vorher erwähnt gehabt.


    ... ich auch :-P

  • - Sonderzeichen wie ', oder < und > im Eintrag werden immer noch an die db übertragen, ist das normal?

    Davon ausgehen dass du mit type=text getestet hast: ja. Die Zeichen sollen ja nur so behandelt werden, dass sie keinen Schaden anrichten können, entfernt werden sie aber natürlich nicht.

    In der newsletter.php befindet sich das prepared statement.

    Wie m.scatello schon schrieb: du hast das mit dem Affenformular noch nicht begriffen. Außerdem hast du schon wieder Code kopiert ohne ihn zu lesen/zu verstehen - sonst hättest du nämlich den Kommentar "Registrierung ausführen..." gesehen: der muss natürlich durch den Code für die Speicherung der Daten ersetzt werden. Auch die Zeile »$statement->execute(array($mail));« in der newsletter.php zeigt dass du es noch nicht wirklich verstanden hast: ich habe bereits mehrfach geschrieben, dass ein umkopieren von $_POST['mail'] nicht nötig ist, du verwendest aber trotzdem immer noch $mail statt $_POST['mail'].

    Ich bin dann erstmal raus hier, eine Antwort gibt es erst wieder wenn deutlich wird, dass das Verständnis da ist.

  • Wie m.scatello schon schrieb: du hast das mit dem Affenformular noch nicht begriffen. Außerdem hast du schon wieder Code kopiert ohne ihn zu lesen/zu verstehen - sonst hättest du nämlich den Kommentar "Registrierung ausführen..." gesehen: der muss natürlich durch den Code für die Speicherung der Daten ersetzt werden. Auch die Zeile »$statement->execute(array($mail));« in der newsletter.php zeigt dass du es noch nicht wirklich verstanden hast: ich habe bereits mehrfach geschrieben, dass ein umkopieren von $_POST['mail'] nicht nötig ist, du verwendest aber trotzdem immer noch $mail statt $_POST['mail'].

    Ich bin dann erstmal raus hier, eine Antwort gibt es erst wieder wenn deutlich wird, dass das Verständnis da ist.

    "Registrierung ausführen..." habe ich gesehen, nur noch keine Übergabe an die db zusammenbekommen.

    Und ja, warum ich die Zeile in der Newsletter ändern soll habe ich nicht verstanden - wird vermutlich auch noch dauern bis ich den Code 100% lesen und verstehen kann und werde. Ich habe eh erwähnt dass ich mir php noch gar nicht angeschaut habe um gleich alles zu verstehen.


    Danke trotzdem für Deine Geduld und Hilfestellung.

    Du hast mir sehr viel weitergeholfen :-) LG

  • tk1234

    Darf ich mal eine Frage zu dir werfen ( Gehört so halbwegs mit zum Thema) ?

    In diesen Code steht ja jetzt

    Code
    1. <form action="newsletter.php" method="post">

    man könnte ja, weil es ein Affenformular ist ja auch den Code nutzen

    PHP
    1. <form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">

    Das hat man auch schon 1000 mal gesehen.

    In einem anderen Forum habe ich mal gelesen, das man das nicht mehr benutzen soll und auf

    Code
    1. SCRIPT_NAME
    2. REQUEST_URI

    wechseln sollte (Bin mir nicht mehr ganz sicher was da stand).

    Was hältst du von der Methode?

    , oder sollte man den Dateinamen ausschreiben oder die Action ganz weglassen wie schon gesagt wurde ?

  • man könnte ja, weil es ein Affenformular ist ja auch den Code nutzen PHP
    <form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">

    Das hat man auch schon 1000 mal gesehen.

    … und war schon 10000mal falsch: das ist eine gefährliche Sicherheitslücke, auch hier muss der (doppelte!) Kontextwechsel beachtet werden!

    Die von dir genannten Varianten PHP_SELF, SCRIPT_NAME und REQUEST_URI enthalten alle unterschiedliche Werte. Mit »/index.php/"onmouseover="alert('hi')« als URI und ohne Behandlung der Kontextwechsel bekommst du als Ergebnis jeweils (ich habe mal ein a-Element genommen, das gleiche gilt natürlich für form):

    HTML
    1. <a href="/index.php/"onmouseover="alert('hi')">PHP_SELF</a><br>
    2. <a href="/index.php/%22onmouseover=%22alert('hi')">REQUEST_URI</a><br>
    3. <a href="/index.php">SCRIPT_NAME</a><br>

    Wie du siehst, ist PHP_SELF gefährlich: das ist eine Sicherheitslücke da sich beliebiger HTML-Code (und damit auch JS-Code) einschleusen lässt. Bei REQUEST_URI wird der Wert URL-Codiert (macht PHP anscheinend von alleine, nachgeforscht warum und weshalb habe ich da jetzt nicht, meine lokale PHP-Installation (aktuell PHP 8.0) spuckt das aber so aus) und bei SCRIPT_NAME wird alles nach dem Dateinamen abgeschnitten (auch ein evtl. vorhandene path-info).

    Wenn man allerdings alle URIs auf die index.php umschreibt (was bei aktuellen Scripten oft/meist der Fall ist) und die entscheidet was geladen wird, fallen zwei Varianten weg: beim Aufruf von z.B. »/training/«, spucken PHP_SELF und SCRIPT_NAME nur »/index.php« aus - was natürlich unbrauchbar ist. Nur REQUEST_URI enthält den hier benötigten Wert »/training/«.


    Was hältst du von der Methode?

    Viel. Viel Abstand. Soweit ich mich erinnere hat das historische Gründe: früher war das action-Attribut notwendig und konnte/durfte nicht weggelassen werden - in HTML5 darf das Attribut weggelassen werden, in dem Fall ist automatisch die aktuelle URI das Ziel des Formulars - warum soll man sich die Mühe machen die URI von Hand da reinzubasteln?

  • PHP_SELF habe ich oft gesehen bei Scripten die man herunterladen kann und 1 zu 1 benutzen kann.

    Viele haben dann die ( index.php) ohne Probleme in chat.php oder my_chat umbenennen könnte, ohne das man in der Datei die Action Attributen ändern musste.


    Ich danke dir aber für die Aufklärung.

    Ich habe das natürlich auch mal in Google eingetippt und auch Negative Antworten bekommen.

    Leider gab es auch (überwiegend in älteren Beitragen) wo PHP_SELF OK wahr.


    Deswegen finde ich das gut, dass ein Erfahrender PHP Programmierer aktuell was dazu sagt.

    Wenn man so in den Foren rumsurft, gibt es ca. 5-10 User die ich nach meiner Einschätzung als PHP Programmierer einordnen würde.

    Falls sie Antworten glaube, ich das auch was da steht.

    Ok.

    Danke dir tk1234 für die Erklärung

  • Wie m.scatello schon schrieb: du hast das mit dem Affenformular noch nicht begriffen. Außerdem hast du schon wieder Code kopiert ohne ihn zu lesen/zu verstehen - sonst hättest du nämlich den Kommentar "Registrierung ausführen..." gesehen: der muss natürlich durch den Code für die Speicherung der Daten ersetzt werden. Auch die Zeile »$statement->execute(array($mail));« in der newsletter.php zeigt dass du es noch nicht wirklich verstanden hast: ich habe bereits mehrfach geschrieben, dass ein umkopieren von $_POST['mail'] nicht nötig ist, du verwendest aber trotzdem immer noch $mail statt $_POST['mail'].

    Ich bin dann erstmal raus hier, eine Antwort gibt es erst wieder wenn deutlich wird, dass das Verständnis da ist.

    Hallo :-) Das Prinzip von einem Affenformular ist jetzt klar -> wiederhole den Vorgang so lange bis die Eingabe korrekt ist.

    Auch die Themen "Registrierung ausführen" und "$_Post" konnte ich Lösen und das Newsletter-Formular funktioniert wie es soll.


    Falls ihr es mir erlaubt, hätte ich noch eine Frage:

    • Gibt es eine Möglichkeit, zu überprüfen ob in der DB eine E-Mail Adresse bereits vorhanden ist, um doppelte Einträge zu verhindern?
      # Der User soll eine Fehlermeldung bekomme
      # Als Teillösung habe ich in phpmyadmin die Spalte 'mail' auf Index: Unique gestellt, um dort den Doppeleintrag zu verhindern


  • Gibt es eine Möglichkeit, zu überprüfen ob in der DB eine E-Mail Adresse bereits vorhanden ist, um doppelte Einträge zu verhindern?

    Vor dem Speichern abfragen ob es Datensätze es mit der Adresse gibt, wenn ja -> Fehlermeldung. Alternativ kannst du auch prüfen ob das execute fehlschlägt oder nicht (mit deinem Unique-Index wird jeder weitere Eintrag eine Adresse einzutragen ja fehlschlagen, das lässt sich abfangen).


    Übrigens: du denkst an sowas wie Double-Opt-in damit nicht jeder beliebige Adresse da eintragen kann die vielleicht gar keinen Newsletter haben wollen?

  • Vor dem Speichern abfragen ob es Datensätze es mit der Adresse gibt, wenn ja -> Fehlermeldung. Alternativ kannst du auch prüfen ob das execute fehlschlägt oder nicht (mit deinem Unique-Index wird jeder weitere Eintrag eine Adresse einzutragen ja fehlschlagen, das lässt sich abfangen).


    Übrigens: du denkst an sowas wie Double-Opt-in damit nicht jeder beliebige Adresse da eintragen kann die vielleicht gar keinen Newsletter haben wollen?

    Danke die Abfrage hat mit einem SELECT * FROM Statement super funktioniert. Der Newsletter macht bereits das was ich mir vorgestellt habe!

    Die Double-Opt-in Funktion ist eine gute Idee und schaue ich mir die kommenden Tage an..


    Eine Frage habe ich noch..

    Der Newsletter ist in der Fußzeile integriert. Wird eine E-Mail Adresse eingegeben, läd die Seite neu - Dadurch wird der User wieder hoch zum Start geleitet.

    Was muss ich tun damit zB. bei einer falschen Eingabe der User unten beim Newsletter bleibt?

  • Danke die Abfrage hat mit einem SELECT * FROM Statement super funktioniert.

    Vergiss dass es den Stern hinter "SELECT" gibt, gib *immer* die Spalten an die du brauchst.

    Die Double-Opt-in Funktion ist eine gute Idee und schaue ich mir die kommenden Tage an..

    Ich würde es weniger als "gute Idee" ansehen sondern eher als Pflicht …

    Der Newsletter ist in der Fußzeile integriert. Wird eine E-Mail Adresse eingegeben, läd die Seite neu - Dadurch wird der User wieder hoch zum Start geleitet.

    Was muss ich tun damit zB. bei einer falschen Eingabe der User unten beim Newsletter bleibt?

    Wie schon in #16 geschrieben: entweder dem form-Element die Attribute action="#newsletter" und id="newsletter" (statt »newsletter« kann da natürlich auch was anderes stehen) verpassen oder eigene Seite für die Newsletteranmeldung machen.

  • Vergiss dass es den Stern hinter "SELECT" gibt, gib *immer* die Spalten an die du brauchst.

    alles klar!

    Ich würde es weniger als "gute Idee" ansehen sondern eher als Pflicht …

    ich habe nur kurz nachgelesen, aber scheint sogar rechtlich notwendig zu sein. Danke für den Tipp!

    Wie schon in #16 geschrieben: entweder dem form-Element die Attribute action="#newsletter" und id="newsletter" (statt »newsletter« kann da natürlich auch was anderes stehen) verpassen oder eigene Seite für die Newsletteranmeldung machen.

    Funktioniert super!! :-D


    Vielen vielen Dank für die großartige Hilfe ->Toller Typ, tolles Forum :-)