Nabend zusammen,
ich war gerade dabei den PHP-Code meiner Seite ein wenig zu überarbeiten. Dieser sieht aktuell so aus:
kontakt.php
<?php
require_once('php/config.php');
require_once('php/functions.php');
// Form abgesendet?
if ($_POST['submit'] == 'Senden') {
// Deklarationen von Variablen bzgl. Form
$name = $_POST['name']; // Name des Absenders
$email = explode(',', $_POST['email']);
// Überprüfung bzgl. E-Mail Injection
if(count($email) > 1){
$response = '<p><strong>Fehler! Sie dürfen nicht mehrere E-Mails angeben. Die erste E-Mail wurde als Absender-Adresse ausgewählt.</strong></p>';
}
// Nehme nur erste E-Mail
$email = $email[0];
$subject = $_POST['subject']; // Betreff für Mail
$message = $_POST['message']; // Nachricht für Mail
}
?>
<!DOCTYPE html>
<html lang="de">
<head>
<title>Kontakt - Webdesign JR</title>
<?php require_once('includes/sections/head.php'); ?>
</head>
<body id="navMenu_open">
<div id="wrapper">
<!-- Header -->
<?php include_once('includes/sections/header.php'); ?>
<!-- Nav -->
<?php include_once('includes/sections/nav.php'); ?>
<main>
<div id="heading_container">
<h2 id="heading">Kontakt</h2>
</div>
<p id="kontakt">Sie möchten mit mir, dem Betreiber der Website, Kontakt aufnehmen? Dann nutzen Sie doch bitte das folgende Kontaktformular oder <a href="<?php echo "mailto:$empfaenger"; ?>" title="<?php echo $empfaenger; ?>">schreiben Sie mir manuell eine E-Mail</a>.</p>
<form action="<?php echo htmlspecialchars($_SERVER['PHP_SELF']); ?>" method="post">
<div id="form-row">
<div class="form-col">
<label for="name">Ihr Name (optional):</label><input type="text" name="name" id="name" maxlength="30">
</div>
<div class="form-col">
<label for="email">Ihre E-Mail-Adresse:</label><input type="email" name="email" id="email" maxlength="30">
</div>
</div>
<div id="subject_container">
<label for="subject">Betreff:</label><input type="text" name="subject" id="subject" maxlength="50">
</div>
<label id="label_message" for="message">Ihre Nachricht:</label>
<textarea cols="80" rows="10" name="message" id="message" maxlength="2500"></textarea>
<input type="submit" value="Senden" id="submit-button" name="submit">
<?php
if (!empty($response)) {
// evtl. versuchte Email Injection, dementsprechende Ausgabe
echo $response;
// Überprüfe Form
$response = checkForm($email, $subject, $message, $name);
if ($response === true) {
// alle Felder wurden ausgefüllt
// Validiere Form Data
$validData = validateFormData($name, $email, $subject, $message);
$name = $validData['name'];
$email = $validData['email'];
$subject = $validData['subject'];
$message = $validData['message'];
// Überprüfung der angegebenen E-Mail
if (isEmail($email)) {
// E-Mail ist valide
// Name vorhanden
if (!empty($name)) {
// füge Namen zur Nachricht hinzu
$message .= PHP_EOL . PHP_EOL . PHP_EOL . PHP_EOL . 'Gesendet von: ' . $name;
}
// Versendung der Mail
if (sendEmail($receiver, $subject, $message, $headers)) {
echo '<p><strong>Vielen Dank! Ihre Nachricht wurde erfolgreich versendet.</strong></p>';
} else {
echo '<p><strong>Offenbar ist ein Fehler beim Versand der E-Mail aufgetreten. Bitte versuchen Sie es später nochmal oder <a href="mailto:habichvergessen40@gmail.com" title="' . $receiver . '">schreiben Sie mir manuell eine E-Mail</a>. Vielen Dank für Ihr Verständnis!</strong></p>';
}
} else {
// E-Mail ist invalide
echo '<p><strong>Sie haben keine standardkonforme E-Mail angegeben. Bitte korrigieren Sie dies.</strong></p>';
}
} else {
echo $response;
}
} else {
// Überprüfe Form
$response = checkForm($email, $subject, $message, $name);
if ($response === true) {
// alle Felder wurden ausgefüllt
// Validiere Form Data
$validData = validateFormData($name, $email, $subject, $message);
$name = $validData['name'];
$email = $validData['email'];
$subject = $validData['subject'];
$message = $validData['message'];
// Überprüfung der angegebenen E-Mail
if (isEmail($email)) {
// E-Mail ist valide
// Name vorhanden
if (!empty($name)) {
// füge Namen zur Nachricht hinzu
$message .= PHP_EOL . PHP_EOL . PHP_EOL . PHP_EOL . 'Gesendet von: ' . $name;
}
// Versendung der Mail
if (sendEmail($receiver, $subject, $message, $headers)) {
echo '<p><strong>Vielen Dank! Ihre Nachricht wurde erfolgreich versendet.</strong></p>';
} else {
echo '<p><strong>Offenbar ist ein Fehler beim Versand der E-Mail aufgetreten. Bitte versuchen Sie es später nochmal oder <a href="mailto:habichvergessen40@gmail.com" title="' . $receiver . '">schreiben Sie mir manuell eine E-Mail</a>. Vielen Dank für Ihr Verständnis!</strong></p>';
}
} else {
// E-Mail ist invalide
echo '<p><strong>Sie haben keine standardkonforme E-Mail angegeben. Bitte korrigieren Sie dies.</strong></p>';
}
} else {
echo $response;
}
}
?>
</form>
</main>
</div>
<!-- Footer -->
<?php include_once('includes/sections/footer.php'); ?>
</body>
</html>
<?php require_once 'includes/sections/foot.php'; ?>
Alles anzeigen
functions.php
<?php
require_once('config.php');
// Copyright im Footer setzen
function setCopyright($startYear, $currentYear) {
// wenn das aktuelle Jahr größer als das Anfangsjahr ist
if ($currentYear > $startYear) {
// setze Copyright für Zeitraum
$copyright = $startYear . ' - ' . $currentYear;
} else { // wenn das aktuelle Jahr noch das Anfangsjahr ist
// setze Copyright für einzelnes Jahr
$copyright = $currentYear;
}
return $copyright;
}
// Form überprüfen
function checkForm($email, $subject, $message, $name=null) {
// Form abgesendet?
if ( $_POST['submit'] == 'Senden' ) {
// kein erforderliches Feld wurde ausgefüllt?
if ( empty($email) && empty($subject) && empty($message) ) {
return '<p><strong>Fehler! Sie haben alle erforderlichen Felder nicht ausgefüllt. Bitte korrigieren Sie dies.</strong></p>';
} else if ( empty($email) ) { // E-Mail wurde nicht angegeben
return '<p><strong>Fehler! Sie haben Ihre E-Mail-Adresse nicht eingetragen. Bitte korrigieren Sie dies.</strong></p>';
} else if ( empty($subject) ) { // Betreff wurde nicht angegeben
return '<p><strong>Fehler! Sie haben den Betreff nicht eingetragen. Bitte korrigieren Sie dies.</strong></p>';
} else if ( empty($message) ) { // Nachricht wurde nicht eingetragen
return '<p><strong>Fehler! Sie haben Ihre Nachricht nicht eingetragen. Bitte korrigieren Sie dies.</strong></p>';
} else { // alle Felder wurden ausgefüllt
return true;
}
}
}
// Validiere Form Data
function validateFormData($name, $email, $subject, $message) {
// erstelle Array mit validierter Form Data
$validData = array('name' => htmlspecialchars(stripslashes(trim($name))),
'email' => htmlspecialchars(stripslashes(trim($email))),
'subject' => htmlspecialchars(stripslashes(trim($subject))),
'message' => htmlspecialchars(stripslashes(trim($message))));
return $validData;
}
// Überprüfe, ob E-Mail eine standardkonforme E-Mail ist
function isEmail($email) {
if (filter_var($email, FILTER_VALIDATE_EMAIL)) {
return true;
} else {
return false;
}
}
// Mail über Kontaktform senden
function sendEmail($receiver, $subject, $message, $headers) {
// gibt es einen Empfänger und wurde die E-Mail erfolgreich versendet?
if ( !empty($receiver) && mail($receiver, $subject, $message, implode("\r\n", $headers)) ) {
return true;
} else {
return false;
}
}
// Error Handling
function handleErrors($php_error_file, $receiver_errors, $subject_errors, $message_errors, $headers_errors) {
// Sammel alle Errors aus PHP-Error-File in Array
$errors = file($php_error_file);
// Wenn mehr als oder gleich 3 Fehler vorhanden sind
if (count($errors) >= 3) {
// sende Info-Mail an Admin
mail($receiver_errors, $subject_errors, $message_errors, implode("\r\n", $headers_errors));
}
}
?>
<?php require_once 'includes/sections/foot.php'; ?>
Alles anzeigen
Das, was mir daran noch nicht gefällt, ist die Tatsache, dass ich in der kontakt.php eigentlich zweimal den selben Code habe. Nämlich von Zeile 69-101 und von 103-135.
Die Frage wäre jetzt im Prinzip, ob es Sinn macht den Code in einer Funktion zusammenzufassen. Der Grund dafür, dass ich es bisher noch nicht gemacht habe, ist, dass ich dann in der Funktion nochmals Funktionen aufrufen müsste und da bin ich mir nicht sicher, ob das so sinnvoll ist. Außerdem wäre dies ja keine klassische Funktion, wie z.B. meine validateFormData(), die einen klaren Zweck hat und eine Aufgabe erledigt. Die Funktion, in der ich dann den doppelten Code zusammenführen würde, wäre einfach nur dazu da, fast den ganzen "Programmablauf" auszuführen und das ist doch eher nicht der Sinn einer Funktion, würde ich sagen.
Was würdet ihr an meiner Stelle machen?
Bin auch gerne offen für ganz andere Ideen.
Bedanke mich schon mal für eure Ratschläge.
Gruß
JR Cologne