3 kleine Fragen zu PHP?

Ben Sellin  18.10.2022, 15:33

Zu 1.: Was für eine Art Bestätigung? Soll der Button grün werden? Soll ein Modal angezeigt werden? Soll ein Text hinzugefügt werden?

Luna93136 
Fragesteller
 18.10.2022, 15:43

ein alert wo man bestätigen oder abbrechen kann wäre praktisch das man den Knopf nicht aus versehen drückt

Ben Sellin  18.10.2022, 15:34

Zu 2.: Wenn der Code des Buttons aussagt, dass die Webseite neu geladen wird, dann wird diese neu geladen. Was soll der Button denn anderes machen?

Luna93136 
Fragesteller
 18.10.2022, 15:44

Eigentlich sollen nur ein paar variablen kopiert werden und nichts großes, muss dafür wirklich die gesamte Webseite neu geladen werden?

5 Antworten

Vom Fragesteller als hilfreich ausgezeichnet
Ich habe einen Button mit php gemacht und würde gerne noch eine Bestätigung einbauen, aber da weiß ich leider nur wie ich es mit js mache!

Eine Bestätigung kann nur in der Form erfolgen, dass nach Formularversand (bzw. einem Request) eine Nachricht ausgegeben wird.

Beispiel:

<!doctype html>
<title>Example</title>
<form>
  <button name="sent">Send</button>
</form>
<?php
  if (isset($_GET['sent'])) {
    print 'Form was sent.';
  }
?>

Die Handhabung vor einem Request (also bspw. vor Verschicken des Formulars) kann nur mittels JavaScript erfolgen.

Ist es möglich das die Seite sich nicht jedes Mal neu lädt wenn man einen Button drückt? Das ist teilweise echt unschön!

Ja. Du kannst den Request mit JavaScript an dein PHP-Skript schicken und eine Antwort bei Bedarf auch im Dokument ausgeben lassen.

Beispiel:

<!doctype html>
<title>Example</title>
<form id="my-form">
  <button name="sent">Send</button>
  <output id="output"></output>
</form>
<script>
  document.getElementById("my-form").addEventListener("submit", evt => {
    evt.preventDefault();
    const data = new URLSearchParams(new FormData(form));
    fetch("script.php", { method: "post", body: data })
      .then(response => response.text())
      .then(answer => {
        document.getElementById("output").textContent = answer;
      });
  });
</script>

Hierbei wird eine Funktion an das submit-Ereignis des Formulars gehängt. Sobald das Ereignis eintritt, werden die Formulardaten gesammelt und zu einen Querystring verbunden. Der wird dann mittels fetch an ein PHP-Skript geschickt. Den Response, den das PHP-Skript liefert, erhält die Callback-Funktion. Der Response Text würde hier als Textknoten in das output-Element eingesetzt werden.

script.php:

<?php
  if (isset($_POST['sent'])) {
    print 'Form was sent.';
  }

Genaue Details zur fetch-API und Weiterem kannst du auf MDN nachschlagen.

ich habe eine Textdatei auf die ich einen Text speichern und bearbeiten kann, ist es möglich dort auch Text anzuhängen statt in zu überschreiben?

Dafür gibt es, je nachdem, welche PHP-Funktion du verwendest, entsprechende Argumente / Flags. Schlag in der PHP-Dokumentation nach.

Beispiel:

file_put_contents("path/to/some/file.txt", "New content", FILE_APPEND);

Luna93136 
Fragesteller
 18.10.2022, 16:08

Okay schade, die Bestätigung bräuchte ich vorher damit man den Knopf nicht aus versehen drückt und alles überschreibt und ich traue mich irgendwie nicht wirklich JavaScript und php zu vermischen, damit richte ich vermutlich mehr schaden an als das es funktioniert..

und für einen Anfänger ist es nicht möglich das sich die Seite nicht neu lädt, das ist so kompliziert da blicke ich gerade noch nicht durch

Das mit dem File_Append habe ich schon probiert und theoretisch funktioniert es auch aber mit der wiederausgrabe fehlt der Teil..

1
regex9  18.10.2022, 16:13
@Luna93136

Das erste Problem kannst du leicht mit einer Checkbox lösen. Wenn die vom Nutzer nicht angehakt wird, darf er das Formular nicht verschicken.

<form action="script.php" method="post">
  <input name="allowed" required type="checkbox">
  <button>Send</button>
</form>

script.php:

<?php
  if (isset($_POST['allowed'])) {
    // evaluate form data ...
  }

  header('Location: startpage.html');
  exit;
aber mit der wiederausgrabe fehlt der Teil..

Ich habe keine Ahnung, was du damit meinst.

0
Luna93136 
Fragesteller
 18.10.2022, 16:26
@regex9

Mit dem letzten Teil meine ich das wenn den Text ausgeben will fehlt der Teil des hinzugefügten! Ich habe es immer folgendermaßen gemacht ->

if ($_REQUEST['sent']) {

          $file = 'action.txt';

          $content2 = unserialize(file_get_contents($file));

          echo nl2br("<center>$content2<center>");}

0
regex9  18.10.2022, 16:54
@Luna93136

Zuerst einmal würde ich dir deutlich davon abraten, mit $_REQUEST zu arbeiten. In dieses Array laufen GET-, POST- und Cookie-Dateien hinein, was deine Anwendung von außen stärker manipulierpar macht. Empfange immer nur Daten aus den Quellen, aus denen du sie explizit erwartest.

Den Aufruf von unserialize benötigst du überhaupt nicht. Du erwartest doch lediglich Text, der in einen anderen Text wiederum eingesetzt wird. Wenn du den Text, den du in der Datei speicherst, des Weiteren nicht richtig validierst, wäre das sogar eine Sicherheitslücke.

Bei der Textausgabe fällt des Weiteren auf, dass du vermutlich invalides HTML zusammenbaust. Wenn du HTML5 verwendest, gibt es den center-Tag nicht mehr. Und auch bei Einsatz früherer HTML-Versionen: Setze CSS für Stylings ein.

Beispiel:

echo nl2br("<div style=\"text-align:center\">$content2</div>");

Und zu deinem grundsätzlichen Problem: Stelle erst einmal sicher, dass die Daten auch in der richtigen Datei landen. Beim Schreiben wäre es vorteilhaft, die Datei zu sperren, damit parallele Prozesse den Vorgang nicht behindern.

file_put_contents("path/to/file.txt", "New content", FILE_APPEND | LOCK_EX);

Die Problemursache könnte ebenso im unserialize-Aufruf liegen.

0
regex9  18.10.2022, 17:09
@regex9

Ein sehr einfach gehaltenes Beispiel:

<!doctype html>
<head>
  <title>Example</title>
  <meta charset="utf-8">
</head>
<body>
  <form method="post">
    <textarea name="text"></textarea>
    <button>Send</button>
  </form>
  <?php
    $filepath = 'test.txt';

    if (isset($_POST['text'])) {
      $data = $_POST['text'];
      // validate data ...
      file_put_contents($filepath, $data . PHP_EOL, FILE_APPEND | LOCK_EX);
    }

    $content = file_exists($filepath) ? file_get_contents($filepath) : '';
  ?>
  <div style="text-align:center"><?= nl2br($content) ?></div>
</body>
0
Luna93136 
Fragesteller
 18.10.2022, 17:21
@regex9

$_Request hat aber am besten funktioniert?

und unserialize benötige ich weil sonnst s:12:"Beispieltext"; kommt aber es sollte nur Beispieltext kommen!

und danke, ich weiß auch nicht warum ich an dieser einen stelle <Center> Genommen habe..

und Danke für den Rat, Lock_ex setze ich ein!

und ja das Problem liegt an unserialize aber ohne kommt eben ein neues Problem!

0
regex9  18.10.2022, 17:40
@Luna93136
$_Request hat aber am besten funktioniert?

Ich gebe hier soweit nur Tipps/Ratschläge. Was du daraus machst, musst du natürlich selbst entscheiden.

Die anderen superglobalen Variablen funktionieren ebenfalls, sofern du sie richtig einsetzt. Wenn das method-Attribut des Forms den Wert post hat, landen die Formulardaten im $_POST-Array. Andernfalls in $_GET.

und unserialize benötige ich weil sonnst s:12:"Beispieltext"; kommt aber es sollte nur Beispieltext kommen!

Da du in deinem obigen Snippet nl2br verwendest, wäre ich davon ausgegangen, dass du neue Eingaben auch mit einem Zeilenumbruch trennst und des Weiteren alle Zeilen ausgeben möchtest.

Bei einer Trennung der Daten mit Doppelpunkt hingegen würde ich nach dem letzten Doppelpunkt im Text suchen. Ausgehend von dieser Position lässt sich der gesuchte Substring herauslösen.

$positionOfLastColon = strrpos($content, ':');

if ($positionOfLastColon !== false) {
  $content = substr($content, $positionOfLastColon + 1);
}

print $content;
0

Ich versuch einmal auf die Fragen einzugehen.

  1. Der Button wird vermutlich ein einfacher HTML Button sein, denn PHP kann keine Oberfläche - PHP "macht" hier noch nichts. Was meinst du genau mit einer Bestätigung? Du willst das der Button zwei mal gedrückt werden muss? Dafür bräuchtest du tatsächlich JavaScript da PHP nicht auf der Seite des Clients arbeitet - nur auf der Seite des Servers. Wenn du allerdings eine Validierung machen möchtest kommst du um eine Serverseitige Validierung nicht drum herum, da eine Validierung per JavaScript relativ leicht ausgehebelt werden kann.
  2. Mittels PHP ist das nicht möglich, nein, da PHP auf dem Server arbeitet und die Anfrage somit immer zum Server gesendet werden muss - die Antwort die du vom Server erhältst ist dann idR die Seite die neu geladen wird. Dafür bräuchtest du andere Techniken wie bspw. Ajax und eine Umsetzung mittels JavaScript. Du würdest auch einen API Server benötigen damit nicht die ganze Seite samt HTML immer hin und her geschickt wird, sondern nur die Daten welche du brauchst. Dann könntest du bspw. mittels PHP eine REST API schreiben welche du mittels JavaScript ansprichst - dann machst du die Server Kommunikation mittels JavaScript und kannst einzelne Inhalte nachladen und musst nicht immer die ganze Seite neu laden.
  3. Diese Textdatei - wo soll die gespeichert bzw. geladen werden? Auf dem Server auf dem deine Seite läuft oder auf dem Client welcher deine Seite nutzt?

Luna93136 
Fragesteller
 18.10.2022, 15:58

Zu 1. Der Button ist kein Button wie ich ihn mit html machen würde sondern ein Input (habe ich beim nachlesen so gelesen..) und ein alert wo man bestätigen oder abbrechen kann wäre praktisch das man den Knopf nicht aus versehen drückt

Zu 2. also viel zu kompliziert, schade das macht es sehr unübersichtlich aber das ist in Ordnung, danke

Zu 3. die Text Datei ist auf dem Server, mit einem Button wird Text aus einer textarea in die Text Datei gespeichert und mit einem anderen Button wieder in die textarea geschrieben das der Text auf allen Geräten gleich ist!

0
regex9  18.10.2022, 16:24
@Luna93136

In HTML gibt es unterschiedliche Formen von Buttons.

<button>Submit button</button>
<input type="button" value="Button">
<input type="reset" value="Reset button">
<input type="submit" value="Submit Button">
<!-- etc. ... -->

Einige sind bereits mit einer bestimmten Funktionalität verbunden oder verhalten sich in der Darstellung etwas anders (Bsp.: Image-Buttons).

Ein Unterschied zwischen button und input-Buttons ist, dass Ersterer einen Wert aufnehmen kann, der nicht der Beschriftung entsprechen muss.

<button value="some value">Some button</button>

Mit PHP baust du für eine Webseite nur den HTML-Code in Textform zusammen. Grafische Oberflächenkomponenten gibt es seitens PHP nicht. Für die Interpretation des Texts ist später der Browser zuständig.

0
Luna93136 
Fragesteller
 18.10.2022, 16:34
@regex9

Das es so viele verschiedene Buttons gibt wusste ich noch nicht, Dankeschön

0

Hallo Luna93136,

aktuell kann ich dir nur zu 3. eine Antwort geben. Weiteres würde ich ergänzen:
Mithilfe der fwrite() - Funktion von PHP kannst du auch Text anhängen (append text to file) und musst damit nicht den bisherigen Inhalt überschreiben.

https://www.w3schools.com/php/func_filesystem_fwrite.asp

Praktisches Beispiel wäre ein Log:

IP Adresse xxx.xxx.xxx.xxx drückt Button am xx.xx.xxxx um xx:xx Uhr

Ben

1.) Bitte selber herausfinden.

2.) Ajax ist dein Freund.

3.) Trick 17:

 <?php
$myfile = fopen("myfile.txt", "r+") or die("Unable to open file!");
$txt = fread($myfile,filesize("myfile.txt"));
$txt = $txt . "Eintrag\n";
fwrite($myfile, $txt);
fclose($myfile);
?>

Woher ich das weiß:Hobby

Luna93136 
Fragesteller
 18.10.2022, 16:01

Wenn ich es selber heraus finden könnte würde ich nicht fragen, nichts funktioniert oder ich bin zu doof dafür..

Ajax habe ich mir mal angesehen aber für einen Anfänger wie mich ist das wohl zu schwer!

und Dankeschön

0

Ich mach mal 2. Du kannst dss mit Ajax mit Request/Response realisieren. Hierzu werden die Daten des Formulars serialisiert und Hilfe von JavaScript, das den Button Click abfängt und die Daten an ein entsprechendes PHP Script schickt. Tutorials gibt es auch für Einsteiger im Netz.

Woher ich das weiß:Berufserfahrung – Web Developer bei einem mittelständischen Portalbetreiber