Willkommen auf dem Portal für Mediengestalter
|
|
Autor |
Nachricht |
Benutzer 4545
Account gelöscht Threadersteller
Ort: -
|
Verfasst Mo 07.04.2008 13:28
Titel php - dateien anhängen etc. [solved] |
|
|
huhu. Ich muss folgendes machen:
Erstellen Sie ein Formular mit folgenden Feldern:
Name, E-Mail, Anrede (Radiobutton: Herr, Frau, Firma), Land (Auswahlliste: D, CH, A u. a.).
Nach dem Absenden des Formulars soll überprüft werden, ob alles ausgefüllt wurde. Falls nein, so
lassen Sie erneut ausfüllen, wobei alte Werte erhalten bleiben sollen. Ist alles ausgefüllt, so werden
die Daten am Bildschirm angezeigt, in eine Datei namens "daten.dat" im selben Verzeichnis als
strichpunktseparierte Liste (Name;E-Mail;Anrede;Land) als „Archiv“ anhängend gespeichert und
per E-Mail (nur die Daten in einer Text-E-Mail, nicht etwa die Datei als Anhang!) an folgende
Adresse versendet: xx@xxx.de
Das mit dem Formular funktioniert. Das Überprüfen der Daten nicht, da mir ein "else" fehlt (bei
den kommentaren) und ich nicht sicher bin was ich da hinschreiben muss.
so wie ich das jetzt verstehe, soll die datei mit den daten dann als text nochmal in einer
email an jemand anderen verschickt werden. wie realisiere ich das denn genau?
ich hatte schon verschiedene versionen, entweder geht das daten überprüfen oder das schreiben in
die datei, aber nie beides. bin über hilfe dankbar.
Code: | <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
</head>
<body>
<?
$datei = "daten.dat";
if ( ! isset ( $_POST [ "Send" ] ) )
{
/*if(empty($_REQUEST['Anrede']) || empty($_REQUEST['Name']) || empty($_REQUEST['Email']) || empty($_REQUEST['Land']))
{
echo"Bitte gehen Sie <a href=\"javascript:history.back();\">zurück</a> und füllen Sie alle Felder aus!";
}
else...*/
?>
<form action="<? echo $_SERVER [ "PHP_SELF" ] ; ?>" method="post">
Anrede:
Herr <input name="Anrede" checked type="radio" value="Herr">
Frau <input name="Anrede" type="radio" value="Frau">
Firma <input name="Anrede" type="radio" value="Firma"><br>
Name:
<input name="Name" type="text"><br>
Email:<input name="Email" type="text"><br>
Land:
<select name="Land" style="width:165px; ">
<option>D</option>
<option >CH</option>
<option>A</option>
<option>UK</option>
<option>DK</option>
</select><br>
<input name="Send" type="submit" value="Abschicken">
<input name="Reset" type="reset" value="Löschen" style="margin-left:20px;"></td>
</form>
<?
}
else
{ // Auswertung - in Datei schreiben
$zeilen = $_POST [ "Anrede" ] . "\n" .
$_POST [ "Name" ] . "\n" .
$_POST [ "Email" ] . "\n" .
$_POST [ "Land" ] . "\n" ;
if ( $fp = fopen ( $datei , "a" ) )
{
fputs ( $fp , $zeilen ) ;
fclose ( $fp ) ;
echo "<h3>Ihre Anfrage wurde gesendet. Vielen Dank! </h3>" ;
}
else
{
echo "<h4>Fehler: Datei nicht zu öffnen</h4>" ;
} // ende if
}
?>
</body>
</html>
|
Zuletzt bearbeitet von am Di 15.04.2008 14:54, insgesamt 1-mal bearbeitet
|
|
|
|
|
rob
Dabei seit: 11.12.2003
Ort: ~/
Alter: 46
Geschlecht:
|
Verfasst Di 08.04.2008 00:52
Titel
|
|
|
Der HTML-Code ist fehlerhaft.
Im Head muß mindestens das title-Element vorkommen.
Auf die Kurzform würde ich verzichten. Eventuell funktioniert dein Script so nicht auf jedem Server. Wenn die Short-Open-Tags nicht aktiviert sind, klappt das so nicht. Daher ist es besser, wenn du immer die lange Form einsetzt:
Wozu die Leerzeichen dort?
Code: | if(empty($_REQUEST['Anrede']) |
Das macht dein Script anfälliger für Angriffe.
Ist es gewollt, daß alle Daten verarbeitet werden, egal wie sie an dein Formular gesendet werden? Vermutlich nicht.
Der Wert des method-Attribut des form-Tags lautet post. Dein Script würde aber auch auf Daten reagieren, die per URL übergeben werden.
Ändere $_REQUEST auf $_POST. Das ist sicherer.
Zitat: | Das Überprüfen der Daten nicht, da mir ein "else" fehlt (bei
den kommentaren) und ich nicht sicher bin was ich da hinschreiben muss. |
Ich wäre die Sache etwas anders angegangen.
Wenn Formular abgeschickt if(isset($_POST['Send'])), empfangene Daten verarbeiten. Wenn Formular nicht abgeschickt, ausfüllbares Formular anzeigen echo $formular;.
So wird dein Formular ja in jedem Fall angezeigt...
Du mußt auch kein Affenformular erstellen (also ein Formular, daß die Daten an sich selbst schickt), sondern könntest ein Dokument mit Formular erstellen und die Daten an ein anderes verarbeitendes Script schicken.
Wie du das machst, bleibt dir überlassen. Ich denke nur, daß Problem ist nicht, daß du nicht weißt, was du als else nehmen sollst, sondern das es einen generellen Konstruktionsfehler gibt.
Du solltest dir einmal ganz genau überlegen wie das alles funktionieren soll. Also nicht einfach drauf los programmieren, sondern erst den Aufbau genau erarbeiten.
Für die meisten meiner Projekte erstelle ich erstmal alles ganz genau und schreibe use-cases mit Diagrammen. Für das hier vielleicht was oversized, aber trotzdem nicht verkehrt, sich genau zu überlegen, wie alles funktionieren soll und wie man alles aufbaut, bevor man loslegt.
Ich will dir nicht sagen, daß es besser wäre, alles zu verwerfen und nach genauer Überlegung nochmal anzufangen oder daß das am besten so machst, wie ich das angedacht hab - es gibt immer eine Menge Wege, die zum Ziel führen.
Aber setz dich vielleicht mal ein paar Minuten hin und denk über den Aufbau nach. Dann änderst du vielleicht ein paar Kleinigkeiten oder vielleicht auch alles... (Aber da du fast fertig bist, würde ich wahrscheinlich nur Kleinigkeiten ändern.)
Das finde ich auch recht unschön:
Code: | echo"Bitte gehen Sie <a href=\"javascript:history.back();\">zurück</a> und füllen Sie alle Felder aus!"; |
Was ist mit den Usern, die kein JS nutzen können/wollen?
Ich setze JS so ein, daß es einen Mehrwert für den User bringt - aber ohne JS sollte auch alles funktionieren, wenn vielleicht auch nicht ganz so schön/komfortabel.
Code: | echo "<h4>Fehler: Datei nicht zu öffnen</h4>" ; |
Warum werden die Umlaute hier maskiert und an anderen Stellen nicht?
Das würde ich einheitlich machen. Wenn du im Head deines Dokumentes die verwendete Zeichenkodierung angibst (die mit der du das Dokument gespeichert hast und die mit der der Server es ausliefert), dann funktioniert auch alles ohne Maskierungen.
Du hast außerdem einen ziemlichen Wust von HTML und PHP zusammengebastelt. Ich glaube, dadurch entstehen deine Probleme.
Wenn du das ein wenig besser von einander trennst, wird es einfacher.
Vielleicht solltest du Funktionen einsetzen, die dein Formular prüfen und ggf. Meldungen ausgeben und Funktionen, die deine Datei schreiben, Mail verschicken, etc..
Dann wird der Code auch übersichtlicher.
Code: | if ( formularcheck() == false ) {
zeige_fehler();
}
else {
schreibe_datei();
} |
Zitat: | so wie ich das jetzt verstehe, soll die datei mit den daten dann als text nochmal in einer
email an jemand anderen verschickt werden. wie realisiere ich das denn genau? |
Zum Verschicken von Mails setzt du die Funktion mail() ein.
Wenn du den Inhalt deiner Datei auslesen willst, dann könntest du das mit file() machen. Dann hast du den Inhalt deiner Datei komplett in einem Array (Zeile für Zeile). Das könntest du dann in einer Schleife durchgehen und an die Mail-Funktion übergeben.
Du könntest die Datei auch mit fopen() öffnen, auslesen, in eine Variable schreiben und dann an mail() übergeben.
readfile() wäre nicht geeignet, weil dadurch der Dateiinhalt direkt in den Ausgabepuffer geschrieben wird.
Gut geeignet wäre auch file_get_contents(). Damit erhältst du dann den Inhalt deiner Datei in einem String. Diesen könntest du dann auch problemlos an mail() übergeben.
Beim Versand der Mail sollte noch bedacht werden, daß du der mail()-Funktion am besten noch zusätzliche Header mit übergibst, so daß die verwendete Zeichenkodierung angegeben wird, falls irgendwelche Sonderzeichen/Umlaute in deiner Datei stehen. Das findest du aber auch noch mal genau in den Beispielen zur Funktion im PHP-Handbuch (was ich verlinkt habe).
Zuletzt bearbeitet von rob am Di 08.04.2008 01:00, insgesamt 1-mal bearbeitet
|
|
|
|
|
Anzeige
|
|
|
Benutzer 4545
Account gelöscht Threadersteller
Ort: -
|
Verfasst Di 15.04.2008 13:34
Titel
|
|
|
hallo, danke für die ausführliche antwort! ich habe das jetzt geändert
und nun folgendes problem: die mail wird nicht verschickt
und ich bekomme diese fehlermeldung:
Fatal error: Call to undefined function: file_get_contents() in /mnt/web6/11/76/5207976/htdocs/aufgabe2/auswertung.php on line 6
normal muss man doch file_get_contents nicht definieren, oder? (mein hoster kann nur php 4.1.2 soweit ich weiß)
da die mail nicht gesendet wird, kann ich auch nicht prüfen, ob das mit dem versenden der daten aus der datei klappt. *hilfesuchendguck*
edit: wenn ich das ganze in meiner xampp-umgebung teste bekomme ich die fehlermail mit der undefined function nicht....nur das er die mail nicht senden kann. liegts doch am webhoster???
Code: | <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Aufgabe 1</title>
</head>
<body>
<form action="auswertung.php" method="post">
Anrede:
Herr <input name="Anrede" checked type="radio" value="Herr">
Frau <input name="Anrede" type="radio" value="Frau">
Firma <input name="Anrede" type="radio" value="Firma"><br>
Name:
<input name="Name" type="text"><br>
Email:<input name="Email" type="text"><br>
Land:
<select name="Land" style="width:165px; ">
<option>D</option>
<option >CH</option>
<option>A</option>
<option>UK</option>
<option>DK</option>
</select><br>
<input name="Send" type="submit" value="Abschicken">
<input name="Reset" type="reset" value="Löschen" style="margin-left:20px;"></td>
</form>
</body>
</html>
|
auswertung.php Code: | <p> </p>
<?php
//überprüfen ob die datei existiert
$datei = 'daten.dat';
if (file_exists($datei)) {
$daten = file_get_contents($datei);
print "Die Datei ist vorhanden.";
} else {
print "Die Datei $datei existiert nicht!";
} //ende dateiüberprüfung
if ( ! isset ( $_POST ["Send"] ) )
{
}
else
{ // Auswertung - in Datei schreiben
$zeilen = $_POST [ "Anrede" ] . "\n" .
$_POST [ "Name" ] . "\n" .
$_POST [ "Email" ] . "\n" .
$_POST [ "Land" ] . "\n" ;
if ( $fp = fopen ( "daten.dat" , "a" ) )
{
fputs ( $fp , $zeilen ) ;
fclose ( $fp ) ;
echo "<h3>Ihre Anfrage wurde gesendet. Vielen Dank! </h3>" ;
}
else
{
echo "<h4>Fehler: Datei nicht zu öffnen</h4>" ;
} // ende if
}
$daten = file_get_contents("$datei", 'r');
if($_REQUEST['Send'])
{
if(empty($_POST['Anrede']) || empty($_POST['Name'])|| empty($_POST['Email']) || empty($_POST['Land']))//überprüfen ob alle Felder ausgefüllt wurden
{
print 'Die Kontaktdaten sind nicht vollständig!';
exit;
}
else //die mail senden
{
$empfaenger = 's.sss@xxx.de';
$betreff = 'Kontaktdaten';
$nachricht = '$daten';
$header = "From: ".$_POST['Email'];
mail($empfaenger, $betreff, $nachricht, $header);
echo"Vielen Dank für Ihre eMail!";
}
}
else
{
echo "Ein Fehler ist aufgetreten. Bitte wenden Sie sich stattdessen per Email an
den Systemadministrator.";
}
?> |
Zuletzt bearbeitet von am Di 15.04.2008 13:40, insgesamt 2-mal bearbeitet
|
|
|
|
|
choise
Dabei seit: 01.02.2007
Ort: Würzburg
Alter: 35
Geschlecht:
|
Verfasst Di 15.04.2008 14:11
Titel
|
|
|
welche php version hat dein hoster ? ( phpinfo() )
|
|
|
|
|
Benutzer 4545
Account gelöscht Threadersteller
Ort: -
|
Verfasst Di 15.04.2008 14:33
Titel
|
|
|
das wars. 4.1.2. habe das mit dem workaround vom manual jetzt probiert, die mail wird verschickt und die fehlermeldung ist nicht mehr da. jetzt habe ich nur noch ein problem: in meiner email soll ja der inhalt der daten.dat -datei stehen. in der email steht aber nur "§datei". woran liegt das noch? ist da was nicht richtig weitergegeben?
Code: | <?php
$datei = 'daten.dat';
//überprüfen ob die datei existiert
//PHP 4.2.x Compatibility function
if (!function_exists('file_get_contents')) {
function file_get_contents($datei, $incpath = false, $resource_context = null)
{
if (false === $fh = fopen($datei, 'rb', $incpath)) {
trigger_error('file_get_contents() failed to open stream: No such file or directory', E_USER_WARNING);
return false;
}
clearstatcache();
if ($fsize = @filesize($datei)) {
$data = fread($fh, $fsize);
} else {
$data = '';
while (!feof($fh)) {
$data .= fread($fh, 8192);
}
}
fclose($fh);
return $data;
}
}
if ( ! isset ( $_POST ["Send"] ) )
{
}
else
{ // Auswertung - in Datei schreiben
$zeilen = $_POST [ "Anrede" ] . "\n" .
$_POST [ "Name" ] . "\n" .
$_POST [ "Email" ] . "\n" .
$_POST [ "Land" ] . "\n" ;
if ( $fp = fopen ( "daten.dat" , "a" ) )
{
fputs ( $fp , $zeilen ) ;
fclose ( $fp ) ;
}
else
{
echo "<h4>Fehler: Datei nicht zu öffnen</h4>" ;
} // ende if
}
$daten = file_get_contents("$datei", 'r');
if($_REQUEST['Send'])
{
if(empty($_POST['Anrede']) || empty($_POST['Name'])|| empty($_POST['Email']) || empty($_POST['Land']))//überprüfen ob alle Felder ausgefüllt wurden
{
print 'Die Kontaktdaten sind nicht vollständig!';
exit;
}
else //die mail senden
{
$empfaenger = 's.sss@xxx.de';
$betreff = 'Kontaktdaten';
$nachricht = '$datei';
$header = "From: ".$_POST['Email'];
mail($empfaenger, $betreff, $nachricht, $header);
echo"Vielen Dank für Ihre eMail!";
}
}
else
{
echo "Ein Fehler ist aufgetreten. Bitte wenden Sie sich stattdessen per Email an
den Systemadministrator.";
}
?> |
|
|
|
|
|
choise
Dabei seit: 01.02.2007
Ort: Würzburg
Alter: 35
Geschlecht:
|
Verfasst Di 15.04.2008 14:41
Titel
|
|
|
innerhalb von ' diesen einzelen klammer (ka jetz vom namen her) werden keine variablen erkannt.
ich hab mir jetzt nich genau durchgelesen was $datei beinhaltet, sollte es ein string sein,
reicht
Code: |
$nachricht = $daten;
oder
$nachricht = "$daten"; // in den doppelten werden variablen erkannt, wobei dieser code unsinn wäre
|
edit: ach ja,.. daten und nicht datei
edit²_ ach ja,... warum lässt du die email immer mit den ganzen kontaktdaten senden ?
reichen nich immer die aktuellsten ?
also:
Code: |
$nachricht = $zeilen;
|
Zuletzt bearbeitet von choise am Di 15.04.2008 14:44, insgesamt 2-mal bearbeitet
|
|
|
|
|
Benutzer 4545
Account gelöscht Threadersteller
Ort: -
|
Verfasst Di 15.04.2008 14:54
Titel
|
|
|
super danke!!!!!!!!!!!!!!!! aha, mit $zeilen bekomme ich die aktuellen...das war mir nicht ganz klar (bin noch ganz frisch). aber schon was dazugelernt!
|
|
|
|
|
|
|
|
Ähnliche Themen |
Löschen von geschützten Dateien (Mac) [solved]
auslesen von dateien und schreiben in neue |solved|
[FPDI] PDF Seiten anhängen
Probleme mit Anhängen bei Mail-Programm
PHP Letzten 4 Zeichen löschen und neue Zeichenkette anhängen
Ganz kleines Problemchen: String an req.open anhängen
|
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|