Kommentar/Mail Form

iMacuser91

Kaiser Wilhelm
Registriert
21.12.06
Beiträge
174
UPDATE: ganz unten auf der Seite ist die aktuellste Version.


Hallo,

ich hab vor kurzem angefangen PHP zu lernen und bin sehr glücklich damit, denn vorallem die include() Funktion hat einiges erleichtert.
Ich hab dann dadurch einen einigermaßen dynamischen Blog eingerichtet, alles selber geschrieben.
Doch jetzt möchte ich mir eine eigene Kommentarfunktion bauen, was irgendwie noch suboptimal (nicht) klappt.
Mein erster Versuch war eine Datei mit Formular, die sich dann selbst überprüft und wenn alle notwendigen Felder angegeben sind, sich selbst aufruft und unter dem ausgefüllten Formularfeld einen Link ausgibt, der dann ein Emailprogramm öffnet, welches dann eine Email generiert, in der Betreff, Empfänger und Text schon angegeben sind, also recht simpel aber für den Nutzer nervig.

Jetzt hab ich ein wenig rumprobiert und das hier geschrieben:
Code:
<?php
	/* Dieses Skript durch index.php unter jeden Blogeintrag einfuegen */
	
	echo "\n";
	echo '<div style="border-top: 3px double #506050; padding-top: 20px; padding-left: 35px;">';				echo "\n\t";
		echo "<form action=\"$_SERVER[´PHP_SELF´]\" method=\"post\">";								echo "\n\t\t";
			echo 'Name: <input style="display: block;" name="yourname" type="text" size="30" />';			echo "\n\t\t";
			echo 'E-Mail: <input style="display: block;" name="email" type="text" size="30" />';			echo "\n\t\t";
			echo 'Homepage: <input style="display: block;" name="homepage" type="text" size="30" />';			echo "\n\t\t";
			echo 'Comment: <textarea style="display: block;" name="comment" rows="10" cols="40"></textarea>';	echo "\n\t\t";
			echo '<input type="reset" /><input type="submit" />';									echo "\n\t";
		echo '</form>';

	if($_POST != false){
		if(empty($_POST['yourname'])){
			echo "Please fill in your name";
			if(empty($_POST['comment'])){
				echo "<br />\n" .  "Please fill in the comment field";
			}
		} else {
			if(empty($_POST['comment'])){
				echo "Please fill in the comment field";
			} else {
			
				/* Hier beginnen kurze Befehle zu Testzwecken */
					echo "Your name: " . $_POST['yourname'] .  "<br />\n";
					if(!empty($_POST['email'])){
						echo "Your email: " . $_POST['email'] . "<br />\n";
					}
					echo "Your comment:<br />\n";
						echo nl2br($_POST['comment']);
				/* Hier enden die Befehle zu Testzwecken */
			
				echo "<br />\n<br />\n";
				echo "Your comment has been sent to the author." . "<br />\n" . "It will appear on this page after he approved it.";
				$empfaenger = "[email protected]";
				$betreff = "Article ID = " . $aid;
				$text = $_POST['yourname'] . ", " . $_POST['email'] . "commented on article \"" . $aid . "\":\n &ldquo;" . $_POST['comment'] . "&rdquo;";
				$absender = "From: " . $_POST['yourname'] . " <[email protected]>";
			
				/* hier beginnen Befehle zu Testzwecken */
					echo "<br />\n<br />\n<br />\n";
					echo $absender;
					echo "<br />\n<br />\n<br />\n";
					echo $text;
				/* Test Ende */
			
				mail($empfaenger,$betreff,$text,$absender);
			}
		}
	}
	echo "\n";
	echo '</div>';
?>

Und rein technisch geht es, was ich an den Testbefehlen sehe, nur weiß ich nicht, ob das mit dem Abschicken wirklich funktioniert.
Über localhost geht das nicht (Apache 1.3.41 auf Tiger) und über meinen Server auch nicht (ist nur ein Ordner auf nem großen Server, dem meine Domain zugewiesen ist, falls es was hilft).

Was ich eigentlich sagen will ist: Kann mir wer helfen und mögliche Fehler verbessern bzw. mir Verbesserungen an sich mitteilen?

Danke, iMacuser91

PS: Die meisten Strings hätte ich auch zusammenfassen können, aber ich finde so ist es übersichtlicher.

EDIT: $aid wird in der index.php Datei erzeugt und die Kommentardatei via include() danach eingefügt.

EDIT2: Falls jemand eine andere Art weiß, wie ich über den Server im Hintergrund eine eMail an mich schicken lassen kann, wenn jemand das Formular ausfüllt, dann wäre das auch hilfreich.
 
Zuletzt bearbeitet:

iMacuser91

Kaiser Wilhelm
Registriert
21.12.06
Beiträge
174
Danke, ich gucks mir nochmal an, aber an sich hab ich meines jetzt so erweitert, dass ich nur noch ein paar Tests machen muss (zwecks Optimierung) und dann gehts.
Ich werd's dann auch mal hier posten, vielleicht braucht es ja wer.
 

iMacuser91

Kaiser Wilhelm
Registriert
21.12.06
Beiträge
174
So, hier die endgültige Version:
Code:
<?php
	/* Dieses Skript durch index.php unter jeden Blogeintrag einfuegen */
	if($aid != true){
		$aid = "test";
	}
	if($title != true){
		$title = "Testpage";
	}
	
	$vn = "";
	$ve = "";
	$vh = "";
	$vc = "";
	if($_POST != false){
		$vn = $_POST['name'];
		$ve = $_POST['email'];
		$vh = $_POST['homepage'];
		$vc = $_POST['comment'];
	}	
	echo "\n";
	echo '<div class="blog_comment">' . "\n";
		echo "Leave a comment:" . "<br />\n";
		echo "<form action=\"$_SERVER[´PHP_SELF´]\" method=\"post\">" . "\n";
			echo '<div class="info">' . "\n";
				echo 'Name: <input name="name" type="text" value="' . $vn . '" size="30" />' . "\n";
				echo 'E-Mail: <input name="email" type="text"value="' . $ve . '" size="30" />' . "\n";
				echo 'Homepage: <input name="homepage" type="text" value="' . $vh . '" size="30" />' . "\n";
				echo '<div class="hc">Test: <input name="test" type="text" size="30" /></div>' . "\n";
			echo '</div>' . "\n";
			echo '<div class="comment">' . "\n";
				echo 'Your Comment: <textarea name="comment" rows="10" cols="40">' . $vc . '</textarea>' . "\n";
			echo '</div>' . "\n";
			echo '<input class="rs" type="reset" /><input class="rs" type="submit" />' . "\n";
		echo '</form>';

	if($_POST != false){
		if(empty($_POST['test'])){
			if(empty($_POST['name'])){
				echo "Please fill in your name";
				if(empty($_POST['comment'])){
					echo "<br />\n" .  "Please fill in the comment field";
				}
			} else {
				if(empty($_POST['comment'])){
					echo "Please fill in the comment field";
				} else {
					echo "Your comment has been sent to the author." . "<br />\n" . "It will appear on this page after he approved it.";
					$empfaenger = "[email protected]";
					$betreff = "Comment on article (ID = " . $aid . ")";
					$intro = $_POST['name'] . " (" . $_POST['email'] . ", " . $_POST['homepage'] . ") commented on &ldquo;" . $title . "&rdquo;:";
					$text = $intro . "\n&ldquo;" . $_POST['comment'] . "&rdquo;";
					$absender = "From: Comment <[email protected]>";
				
					/* hier beginnen weitere Befehle zu Testzwecken */
						echo "<br />\n<br />\n";
						echo $absender;
						echo "<br />\n<br />\n";
						echo $betreff;
						echo "<br />\n<br />\n";
						echo $text;
					/* Test Ende */
				
					mail($empfaenger,$betreff,$text,$absender);
				}
			}
		} else {
			echo 'You are a spambot, go away.' . "\n<br />" . 'If you are not a spambot, please leave "Test" empty.';
		}
	} else {
		echo '<span style="font-size: 10pt;">' . "The name and comment fields are required, your email-address will not be published." . '</span>';
	}		
	echo "\n";
	echo '</div>';
?>

Und das zugehörige CSS (sogar hierarchisch geordnet ;)):
Code:
div.blog_comment{
	border-top: 3px double #506050;
	padding-top: 20px;
	padding-left: 35px;
	}
		
	div.blog_comment div.info{
		float: left;
		margin-top: 5px;
		margin-right: 30px;
		}
					
		div.blog_comment div.info input{
			display: block;
			}
				
		div.blog_comment div.comment textarea{
			display: block;
			}
				
	div.blog_comment div.hc{
			display: none;
			}
	div.blog_comment input.rs{
			clear: both;
			}

Wer es benutzen will sollte vorher nur die Emailadressen anpassen und mail() ausklammern, dann kann man die Eingaben überprüfen bevor was passiert.
Eigentlich ist das nichts allzu tolles, hat nen funktionierenden Spamschutz (für Benutzer unsichtbares Feld), einen Eingabenüberprüfer und wenn die Eingaben ungültig/nicht komplett waren, dann sind die auch nicht verloren.

Viel Spaß damit (falls es jemand brauchen kann).


EDIT (WICHTIG):
23.03.2008
Im Skript tauchen ab und zu $aid und $title auf, die sind bei mir so eingestellt, dass sie in jedem Blogeintrag vorhanden sind, wobei $aid eigentlich nur der Dateiname ohne Endung (das Datum, z.B. 20080311) ist und $title der angezeigte Titel. Das muss halt auch noch angepasst oder entfernt werden (dann aber auch die ersten beiden if() Abfragen, damit alles schön reibungslos geht).
 
Zuletzt bearbeitet:
  • Like
Reaktionen: Nathea