mediengestalter.info
FAQ :: Mitgliederliste :: MGi Team

Willkommen auf dem Portal für Mediengestalter

Aktuelles Datum und Uhrzeit: Fr 26.04.2024 23:29 Benutzername: Passwort: Auto-Login

Thema: php - dateien anhängen etc. [solved] vom 07.04.2008


Neues Thema eröffnen   Neue Antwort erstellen MGi Foren-Übersicht -> Programmierung -> php - dateien anhängen etc. [solved]
Autor Nachricht
Benutzer 4545
Account gelöscht Threadersteller


Ort: -

Verfasst Mo 07.04.2008 13:28
Titel

php - dateien anhängen etc. [solved]

Antworten mit Zitat Zum Seitenanfang

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. *Schnief*

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 &ouml;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: Männlich
Verfasst Di 08.04.2008 00:52
Titel

Antworten mit Zitat Zum Seitenanfang

Der HTML-Code ist fehlerhaft.
Code:
<head>
</head>

Im Head muß mindestens das title-Element vorkommen.

Code:
<?

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:
Code:
<?php ?>


Code:
$_POST [ "Send" ]

Wozu die Leerzeichen dort?
Code:
$_POST["Send"]


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 &ouml;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
  View user's profile Private Nachricht senden
Anzeige
Anzeige
Benutzer 4545
Account gelöscht Threadersteller


Ort: -

Verfasst Di 15.04.2008 13:34
Titel

Antworten mit Zitat Zum Seitenanfang

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* *zwinker*

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>&nbsp;</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: Männlich
Verfasst Di 15.04.2008 14:11
Titel

Antworten mit Zitat Zum Seitenanfang

welche php version hat dein hoster ? ( phpinfo() )
  View user's profile Private Nachricht senden Website dieses Benutzers besuchen
Benutzer 4545
Account gelöscht Threadersteller


Ort: -

Verfasst Di 15.04.2008 14:33
Titel

Antworten mit Zitat Zum Seitenanfang

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: Männlich
Verfasst Di 15.04.2008 14:41
Titel

Antworten mit Zitat Zum Seitenanfang

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;


Hä?


Zuletzt bearbeitet von choise am Di 15.04.2008 14:44, insgesamt 2-mal bearbeitet
  View user's profile Private Nachricht senden Website dieses Benutzers besuchen
Benutzer 4545
Account gelöscht Threadersteller


Ort: -

Verfasst Di 15.04.2008 14:54
Titel

Antworten mit Zitat Zum Seitenanfang

super danke!!!!!!!!!!!!!!!! aha, mit $zeilen bekomme ich die aktuellen...das war mir nicht ganz klar (bin noch ganz frisch). aber schon was dazugelernt! Lächel
 
 
Ä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
Neues Thema eröffnen   Neue Antwort erstellen
MGi Foren-Übersicht -> Programmierung


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.