• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Kleiner Chat/Shoutbox

Konda

Neues Mitglied
Hallo Community,

ich fange gerade an PHP und MySQL zu lernen und wollte einen kleinen Mini-Chat bauen...
Habe ich auch soweit geschafft, aber mich nerven 2 Sachen und ich weiß nicht,
wie ich sie abstellen kann - Vielleicht könnt ihr mir ja helfen :)

Mein Quellcode:
<?php include("Datenbank.php");

// Hier werden die Beiträge welche erstellt wurden erst mal ausgegeben.

$beitraege="SELECT * FROM shoutbox";
$result_beitraege = mysql_query($beitraege);

while($rowbeitraege = mysql_fetch_assoc($result_beitraege)){

echo "<i>".$rowbeitraege['datum']." - ".$rowbeitraege['uhrzeit']."</i><br />";
echo $rowbeitraege['beitrag']."</br></br>";

}


?>

// Ab hier erfolgt die Eingabe


<form action="<?php echo $_SERVER['PHP_SELF'] .'?'. $_SERVER['QUERY_STRING']; ?>" method="post" charset='UTF-8'>

<textarea name="textfeld" maxlength="200"></textarea>
<input type="submit" name="BeitragAbschicken" value="LOS!"/>

</form>



<?php

if (isset ($_POST['BeitragAbschicken'])) {

$benutzername_welche_aus_anderer_mysql_tabelle_kommt ="Tester";

$textfeld = $_POST['textfeld'];
$datum_sort = date("Y-m-d H:i:s");
$datum_anzeige = date("d.m.Y");
$uhrzeit = date("H:i:s");

$sh_beitrag = "INSERT INTO shoutbox
(beitrag, datum, uhrzeit, time)
VALUES(
'".$textfeld."',
'".$datum_anzeige."',
'".$uhrzeit."',
'".$datum_sort."'
)";

mysql_query($sh_beitrag);

}


?>


Meine Probleme:

Wenn ich auf den Button zum abschicken klicke, lädt zwar die Seite neu, aber der Beitrag ist noch nicht da.
Dafür muss ich die Seite erst nochmal aktualisieren.
Wie kann ich ihm beibringen, dass der Beitrag sofort erscheinen soll?

Wenn ich einen Beitrag erstellt habe und immer wieder die Seite z.B. per F5 aktualisiere,
erstellt er diesen Beitrag in der Datenbank auch immer wieder und wieder, obwohl im Textfeld nichts mehr steht.
Wo ist der Text noch eingespeichert, dass dies geschieht? Und wie kann ich dies verhindern?

Ach und da fällt mir noch etwas ein...
Ich möchte von den Beiträgen nur immer die letzten 5 Einträge aus der Datenbank ausgeben und die nach der Zeit sortieren, so dass ich mir aussuchen kann ob er von oben nach unten oder von unten nach oben sortiert. Ich habe in der Datenbank eine Spalte mit dem Typ datetime erstellt... Wie kann ich danach sortieren?

Schon einmal vielen vielen Dank und liebe Grüße
Konda
 
F5 steht für das Neuladen der Seite. Dabei schickst Du das Formular nochmal ab, woraufhin die Verarbeitung erneut startet. Da dein Formular die Daten per POST abschickt, "siehst" du die Texte auch nicht. Sie stehen bei der Ankunft am Server (wenn das Neuladen beendet ist) im POST-Array, woraus sie natürlich wieder verarbeitet und gespeichert werden.

Wenn Du das verhindern willst, müsstest Du einen Reload-Schutz einbauen ODER nach Speicherung der Daten per header() auf eine andere Seite weiterleiten.
 
Zum sortieren:

Dein SQL-Statement müsste so aussehen: "SELECT * FROM shoutbox ORDER BY time DESC LIMIT 0,5"

"time" wäre dann der Name der Spalte vom typ datetime, ich weiß leider nicht wie die bei dir heißt. ;)
 
Zum sortieren:

Dein SQL-Statement müsste so aussehen: "SELECT * FROM shoutbox ORDER BY time DESC LIMIT 0,5"

"time" wäre dann der Name der Spalte vom typ datetime, ich weiß leider nicht wie die bei dir heißt. ;)

Hat geklappt, Danke ;-)


Erstellt er den Beitrag bei F5 immer genauso wieder? Also auch gleiche id?

Immer mit neuer id


F5 steht für das Neuladen der Seite. Dabei schickst Du das Formular nochmal ab, woraufhin die Verarbeitung erneut startet. Da dein Formular die Daten per POST abschickt, "siehst" du die Texte auch nicht. Sie stehen bei der Ankunft am Server (wenn das Neuladen beendet ist) im POST-Array, woraus sie natürlich wieder verarbeitet und gespeichert werden.

Wenn Du das verhindern willst, müsstest Du einen Reload-Schutz einbauen ODER nach Speicherung der Daten per header() auf eine andere Seite weiterleiten.


Gibt es denn bessere Möglichkeiten anstatt POST zu verwenden?
Wie ist das gemeint mit dem Reload-Schutz? Läuft das dann über Cookies?

Ich hatte ja extra folgendes eingebaut:
action="<?php echo $_SERVER['PHP_SELF'] .'?'. $_SERVER['QUERY_STRING']; ?>"
Damit ich immer auf der Seite bleibe, wo ich den Eintrag geschrieben habe.
Kann man das auch wenn man deine 2. Möglichkeit nutzt beibehalten?
 
Du könntest ja auf eine andere Seite weiterleiten, von der du dann wieder auf die Ausgangsseite weiterleitest.
Ja, das funktioniert zwar, hat aber einen unschönen Nebeneffekt.
Dadurch kann ich, falls vorhanden, Fehler nicht mehr anzeigen lassen.
Also wenn das Textfeld z.B. leer ist... vorher erschien dann ein Hinweis... Jetzt nicht mehr.
 
Mhh...
Er leitet ja um, sobald ich auf den Button drücke,
müsste ja bedeutet, dass ich das davor überprüfe...

Dies würde dann bedeuten, dass ich die action des Buttons,
welche sich in der form befindet ändere...

oder?

Mir fällt so direkt nicht ein wie ich das bewerkstellige...
 
Vielleicht mit einer if/else Schleife? (Ich bin da nicht so der Experte...). Aber wenn man sagt:
wenn ein Feld nicht ausgefüllt ist, dann bleib auf der Seite und gib eine Fehlermeldung aus
andernfalls leite weiter.
 
Gibt es denn bessere Möglichkeiten anstatt POST zu verwenden?

Nein, POST ist die optimale Übertragungsmethode für Daten von Eingabeformularen.

Wie ist das gemeint mit dem Reload-Schutz? Läuft das dann über Cookies?

Zur Theorie:
Das Formular muss ein Merkmal beinhalten, welches beim Laden der Seite gesetzt wird. Diese Merkmal wird identisch im gleichen Moment (also bei der Anzeige des Formulars) auch in der Sitzung hinterlegt.

PHP:
$_SESSION["reloadschutzvariable"] = $wert;

Wenn das Formular abgeschickt wird, wird zuerst geprüft, ob der Wert aus der Sitzung mit dem vom Formular übergebenen Wert übereinstimmt. Wenn nicht, dann wurde Reload gedrückt.

PHP:
if( $_POST["reloadschutzvariable") == $_SESSION["reloadschutzvariable"]){ /* alles ok */.. } else { /* reload gedrückt */.. }

Danach wird der Wert aus der Sitzung gelöscht.

PHP:
unset($_SESSION["reloadschutzvariable"]);

Er leitet ja um, sobald ich auf den Button drücke,
müsste ja bedeutet, dass ich das davor überprüfe...

Dann hast Du noch nicht verstanden wie Formulardaten verarbeitet werden sollen. Zeig deinen aktuellen PHP-Code, dann kann man sehen wo deine Fehler liegen.

Vielleicht mit einer if/else Schleife? (Ich bin da nicht so der Experte...).

Stimmt, if-Schleifen gibt es nicht ;) Die heißen if-Bedingung, oder wenns sein muss auch if-Anweisung. Aber es sind keine Schleifen ;)
 
Dann hast Du noch nicht verstanden wie Formulardaten verarbeitet werden sollen. Zeig deinen aktuellen PHP-Code, dann kann man sehen wo deine Fehler liegen.
Code:
<?php include("Datenbank.php"); 


// Ab hier erfolgt die Eingabe
?>




<form action="<?php echo $_SERVER['PHP_SELF'] .'?'. $_SERVER['QUERY_STRING']; ?>" method="post" charset='UTF-8'>


<textarea name="textfeld" maxlength="200"></textarea> 
<input type="submit" name="BeitragAbschicken" value="LOS!"/>










<?php 


if (isset ($_POST['BeitragAbschicken'])) {




$textfeld = $_POST['textfeld']; 
$datum_sort = date("Y-m-d H:i:s");
$datum_anzeige = date("d.m.Y");
$uhrzeit = date("H:i:s");


$sh_beitrag = "INSERT INTO shoutbox
(beitrag, datum, uhrzeit, time)
VALUES(
'".$textfeld."',
'".$datum_anzeige."',
'".$uhrzeit."',
'".$datum_sort."'
)";


mysql_query($sh_beitrag);


}  ?>
</form>
<?php


// Ausgabe der Beiträge


$beitraege="SELECT * FROM shoutbox ORDER BY time DESC LIMIT 0,7";
$result_beitraege = mysql_query($beitraege); 


while($rowbeitraege = mysql_fetch_assoc($result_beitraege)){ 


echo "<i>".$rowbeitraege['datum']." - ".$rowbeitraege['uhrzeit']."</i><br />"; 
echo $rowbeitraege['beitrag']."</br></br>";


}


?>
 
Ich sehe da keinen Versuch von dir überhaupt den Tipp mit der Weiterleitung umzusetzen. Daher nochmal ein Tipp:

Verschiebe den Abschnitt
PHP:
if (isset ($_POST['BeitragAbschicken'])) {




$textfeld = $_POST['textfeld']; 
$datum_sort = date("Y-m-d H:i:s");
$datum_anzeige = date("d.m.Y");
$uhrzeit = date("H:i:s");


$sh_beitrag = "INSERT INTO shoutbox
(beitrag, datum, uhrzeit, time)
VALUES(
'".$textfeld."',
'".$datum_anzeige."',
'".$uhrzeit."',
'".$datum_sort."'
)";


mysql_query($sh_beitrag);


}

direkt hinter

PHP:
include("Datenbank.php");

und ergänze innerhalb dieses Abschnitts nach

PHP:
mysql_query($sh_beitrag);

die Weiterleitung:

PHP:
header("Location: /ziel.html");
 
Zurück
Oben