Keine Seite neu laden nach einem Formular

Du hast mit deiner Vermutung Recht, es ist die gleiche Datei.

Hierbei handelt es sich um die Eingabe des Benutzers für einen Chat.
Mit der Funktion wird praktisch die Eingabe in der Datenbank gespeichert.

Hier mal der Code in der richtigen Reihenfolge, wie ich ihn gerade eingebaut habe:

HTML:
<?php
$text = filter_input(INPUT_POST, 'text');
if( $text == '') {
    $text = filter_input(INPUT_GET, 'text');
}
$text2 = filter_input(INPUT_POST, 'text2');
$privat = filter_input(INPUT_POST, 'privat', FILTER_SANITIZE_STRING);
$user_chat_back = filter_input(INPUT_POST, 'user_chat_back', FILTER_SANITIZE_NUMBER_INT);

if (isset($text2) && strlen($text2) != 0) {
    $text = $text2;
}

if($text != "") {
    schreibe_nachricht_chat($text, $privat, $user_chat_back, $o_id, $benutzerdaten);
}

?>
<div style="margin-top: 3px; margin-left: 5px;">
<?php
// Eingabeformular mit Menu und Farbauswahl
reset($farbe_chat_user);

$text2_typ = "<input type=\"text\" name=\"text2\" autofocus autocomplete=\"off\" maxlength=\"" . ($chat_max_eingabe - 1) . "\" value=\"\" size=\"" . $chat_eingabe_breite . "\">\n";
?>
<form action="eingabe.php" method="post">
    <?php
    echo $text2_typ;
    // Unterscheidung Normal oder sicherer Modus
    if ($sicherer_modus == 1 || $benutzerdaten['u_sicherer_modus'] == "1") {
        echo "<input name=\"text\" value=\"\" type=\"hidden\">\n"
            . "<select name=\"user_chat_back\">\n";
        for ($i = 10; $i <= 40; $i++) {
            echo "<option " . ($chat_back == $i ? "selected " : "") . "value=\"$i\">$i $t[eingabe1]\n";
        }
        echo "</select>\n";
    } else {
        echo "<input name=\"text\" value=\"\" type=\"hidden\">\n";
    }
    echo "<input name=\"id\" value=\"$id\" type=\"hidden\">\n";
    ?>
    <button type="submit">Go!</button>
</form>
<span id="out"></span>
<script>
    document.querySelector('form').addEventListener('submit', event => {
        event.preventDefault();
        fetch('eingabe.php', {
            method: 'post',
            body: new FormData(document.querySelector('form'))
        }).then(res => {
            return res.text();
        }).then(res => {
            //console.log(res);
            document.getElementById('out').innerHTML = res;
        });
    })
</script>
</div>
 
OK, das ist schon wesentlich aufschlussreicher. Erst Mal fehlt da das ganze Grundgerüst mit head und body oder hast Du es weg gelassen, weil es in dem Zusammenhang nicht wichtig ist?
Was funktioniert denn jetzt nicht? Wird der Text nicht in die Datenbank eingetragen?
 
Der Text wird nicht abgesendet, sondern die 2. doppelte Zeile angezeigt.

Eventuell ist es doch einfacher, dir den Link zu schicken:
mainChat/eingabe.php at main · ePfirsich/mainChat

Dort wird aktuell die Eingabe über eine andere Datei in einem anderen Frame (Ja der Chat läuft noch in Frames) abgewickelt.
Genau das will ich entfernen, damit ich den anderen verstecken Frame nicht mehr brauche, da ich die Frames natürlich irgendwann los werden möchte.
 
Bevor Du da mit der Fehlersuche weiter machst, empfehle ich, zunächst die PHP-Datei aufzutrennen: In eingabe.php nur die Genererieung des Formulars und in senden.php nur den Code für das Senden. Und senden.php dann im fetch als URL übergeben:

senden.php:
Code:
<?php
$text = filter_input(INPUT_POST, 'text');
if( $text == '') {
    $text = filter_input(INPUT_GET, 'text');
}
$text2 = filter_input(INPUT_POST, 'text2');
$privat = filter_input(INPUT_POST, 'privat', FILTER_SANITIZE_STRING);
$user_chat_back = filter_input(INPUT_POST, 'user_chat_back', FILTER_SANITIZE_NUMBER_INT);

if (isset($text2) && strlen($text2) != 0) {
    $text = $text2;
}

if($text != "") {
    schreibe_nachricht_chat($text, $privat, $user_chat_back, $o_id, $benutzerdaten);
}

?>

eingabe.php:
Code:
<div style="margin-top: 3px; margin-left: 5px;">
<?php
// Eingabeformular mit Menu und Farbauswahl
reset($farbe_chat_user);

$text2_typ = "<input type=\"text\" name=\"text2\" autofocus autocomplete=\"off\" maxlength=\"" . ($chat_max_eingabe - 1) . "\" value=\"\" size=\"" . $chat_eingabe_breite . "\">\n";
?>
<form action="eingabe.php" method="post">
    <?php
    echo $text2_typ;
    // Unterscheidung Normal oder sicherer Modus
    if ($sicherer_modus == 1 || $benutzerdaten['u_sicherer_modus'] == "1") {
        echo "<input name=\"text\" value=\"\" type=\"hidden\">\n"
            . "<select name=\"user_chat_back\">\n";
        for ($i = 10; $i <= 40; $i++) {
            echo "<option " . ($chat_back == $i ? "selected " : "") . "value=\"$i\">$i $t[eingabe1]\n";
        }
        echo "</select>\n";
    } else {
        echo "<input name=\"text\" value=\"\" type=\"hidden\">\n";
    }
    echo "<input name=\"id\" value=\"$id\" type=\"hidden\">\n";
    ?>
    <button type="submit">Go!</button>
</form>
<span id="out"></span>
<script>
    document.querySelector('form').addEventListener('submit', event => {
        event.preventDefault();
        fetch('senden.php', {
            method: 'post',
            body: new FormData(document.querySelector('form'))
        }).then(res => {
            return res.text();
        }).then(res => {
            //console.log(res);
            document.getElementById('out').innerHTML = res;
        });
    })
</script>
</div>
 
Hallo,

jetzt funktioniert das Senden soweit ganz gut.
Nur wird leider der Text nach dem Absenden in der Eingabe nicht gelöscht.
Wie kann ich denn das noch umsetzen?
 
Das ist relativ einfach: Im then-Zweig des fetch das Eingabefeld löschen:
Code:
<script>
    document.querySelector('form').addEventListener('submit', event => {
        event.preventDefault();
        fetch('senden.php', {
            method: 'post',
            body: new FormData(document.querySelector('form'))
        }).then(res => {
            return res.text();
        }).then(res => {
            //console.log(res);
            document.querySelector('input[name="text2"]').value = '';
            document.getElementById('out').innerHTML = res;
        });
    })
</script>
 
Vielen Dank,
bisher funktioniert es ganz gut.

Ich habe auch gleich noch ein bisschen aufgeräumt. (Unter anderem "text2" nun komplett entfernt, da ich es hier nicht mehr brauche)
 
Ich hätte da noch eine ähnliche Frage dazu:

Ist es auch irgendwie möglich, dies mit einem Linz zu realisieren?
Also dass wenn ich auf einen Link klicke, der Link nicht aufgerufen wird. (Weil ich nur die Funktion dahinter aufrufen will.

Code:
<a href="schreibe.php?param1=value1&param2=value2">Link</a>
 
Zurück