morpheuz: function Inhalt in Variable speichern - warum geht das nicht?

Servus zusammen,

ich habe folgendes vor. Auf einer Formularseite werden die Daten durch den Besucher eingegeben, er klickt nachdem er alle Angaben gemacht hat auf Absenden - es wird eine Vorschau generiert und dann kann sich der Besucher entscheiden, die Daten zu ändern oder per E-Mail zu versenden.

Die Vorschau, sowie der Inhalt der HTML-EMail wird aus der Function createVorschau erstellt. Bei der Vorschau funktioniert das - bei mail() allerdings nicht.

Der Code ist folgender:
________________________________________________
function sendMeldung() {
$to = "to@host.de";
$subject = "Meldung KW" . $_POST['kw'];
$xtra = "From: Melder\r\n";
$xtra .= "Content-Type: text/html\r\nContent-Transfer-Encoding: 8bit\r\n";

// Funktioniert nicht - wie kann man es anders machen?
$sendHTML = createVorschau();

mail($to,$subject,$sendHTML,$xtra);
}
____________________________________________________

Wie gesagt - das funktioniert leider nicht - dass ich in der Variablen $sendHTML gleich den Inhalt reinschreibe, geht leider auch nicht - da unter anderem Datenbankabfragen, Schleifen u.ä. vorhanden sind - Vorallem durch das Formular die Superglobale $_POST['foo'].

Habt Ihr vielleicht eine Idee wie ich das hinkriege?

Ciao morpheuz

  1. Huhu Morpheus

    function sendMeldung() {
    $to = "to@host.de";
    $subject = "Meldung KW" . $_POST['kw'];
    $xtra = "From: Melder\r\n";
    $xtra .= "Content-Type: text/html\r\nContent-Transfer-Encoding: 8bit\r\n";

    // Funktioniert nicht - wie kann man es anders machen?
    $sendHTML = createVorschau();

    mail($to,$subject,$sendHTML,$xtra);
    }
    ____________________________________________________

    Habt Ihr vielleicht eine Idee wie ich das hinkriege?

    Nein, aber Du verrätst ja auch nicht was nicht funktioniert und wie sich das äussert oder welche Fehlermeldung Du bekommst.
    Anscheinend möchtest Du eine HTML-Mail versenden.

    Probiere mal folgendes

    $sendHTML = createVorschau();

    Lass Dir nach dieser Zeile den Inhalt der Variablen ausgeben.

    Lass Dir alle Variablen mit denen Du mail() fütterst anzeigen.
    Teste die Mail-Funktion mit String-Literalen.

    Und versuche bessere Namen für Deine Funktionen zu finden.
    Allgemein üblich ist es sich aus dem Wortschatz _einer_ Sprache zu
    bedienen.

    sendMeldung() und createVorschau() sind ziemlich scheussliche Namen.

    Viele Greetings ;-)

    lulu

    --
    bythewaythewebsuxgoofflineandenjoytheday
  2. Hallo morpheuz,

    $sendHTML = createVorschau();

    was macht die Funktion "createVorschau()"? Gibt sie die Vorschau per echo aus? Dann kann $sendHTML kein Wert zugewiesen werden. Falls es so ist, schreib in createVorschau() die Vorschau selbst in eine Variable und übergebe sie anschließend mit return. Ausgeben kannst Du das ganze dann mit echo createVorschau(). Dann sollte auch Dein "$sendHTML = createVorschau()" funktionieren.

    Grüße,
    small-step

    1. Hallo nochmal,

      hier ist die Funktion welche ich gerne per E-Mail versenden möchte (ist leider etwas groß):

      function createReadinessHTML() {

      print "<br><br> <table border='0' cellpadding='1' cellspacing='1' bgcolor='#000000' width='500'> <tr> <td colspan='2' bgcolor='#990000' align='center'> <font class='headline'>BEREITSCHAFTSMELDUNG</font> </td> </tr> <td bgcolor='#ffffff' colspan='2' align='center'><font> F&uuml;r die Zeit vom <b>" . $_POST['vontag'] . "." .                           $_POST['vonmonat'] . "." .                           $_POST['vonjahr'] . " " .                           $_POST['vonzeit'] . " Uhr</b> bis <b>" .                           $_POST['bistag'] . "." .                           $_POST['bismonat'] . "." .                           $_POST['bisjahr'] . " " .                           $_POST['biszeit'] . " Uhr</b><br /> Woche " .                           $_POST['kw'] . " / " .                           $_POST['bisjahr'] . "</td> </tr> <tr> <td bgcolor='#ffffff'><font> EMR-Werkstatt </td> <td bgcolor='#ffffff'><font> Tel.: 72-" . $_POST['emr_tel'] . " &nbsp;&nbsp; Fax: 72-" . $_POST['emr_fax'] . "</td> </tr> <tr> <td bgcolor='#ffffff' colspan='2' align='center'> <br />

      <!-- MITARBEITER DATEN EMR-W3 --> <table border='0' cellpadding='1' cellspacing='1' bgcolor='#000000' width='400'> <tr> <td bgcolor='#990000' colspan='2' valign='top'><font class='tdesign01'> <b>EMR-W3 Mitarbeiter </td> </tr> <td bgcolor='#ffffff' valign='top' width='68'><font><b>Name:</td> <td bgcolor='#ffffff' valign='top'><font>";

      // DATENBANK QUERY

      require "config.php"; $link = mysql_connect($dbhost, $dbuser, $dbpass)         or die ("Could not connect");           mysql_select_db ($dbname)         or die ("Could not select database");

      $query= "SELECT * FROM personal WHERE personalnummer = " . $_POST['w3_mitarbeiter'];          $result = mysql_query ($query)              or die ("Query failed");

      while($line = mysql_fetch_array($result)) {

      print $line['mit_vorname'] . ", " . $line['mit_nachname'] . "</td> </tr> <tr> <td bgcolor='#ffffff' valign='top'><font><b>Adresse:</td> <td bgcolor='#ffffff' valign='top'><font>" . $line['mit_strasse'] . ", " . $line['mit_plz'] . " " . $line['mit_ort'] . "</td> </tr> <tr> <td bgcolor='#ffffff' valign='top'><font><b>Privat-Tel:</td> <td bgcolor='#ffffff' valign='top'><font>";

      if ($line['mit_telanzeigen'] == 'nein') { print " - "; } else { print $line['mit_telprivat']; } }

      $link = mysql_connect($dbhost, $dbuser, $dbpass)         or die ("Could not connect");           mysql_select_db ($dbname)         or die ("Could not select database");

      $query= "SELECT * FROM handy WHERE handy_id = " . $_POST['w3_handy'];          $result = mysql_query ($query)              or die ("Query failed");

      while($line = mysql_fetch_array($result)) {

      print "</td> </tr> <tr> <td bgcolor='#ffffff' valign='top'><font><b>Handy:</td> <td bgcolor='#ffffff' valign='top'><font>" . $line['handy_nummer'] . "</td>"; }

      print "</tr> <tr> <td bgcolor='#ffffff' valign='top'><font><b> Zust&auml;ndig: </td> <td bgcolor='#ffffff' valign='top'><font> " . $_POST['w3_bereich'] . "</td> </tr> </table>

      <br /><br />

      <!-- MITARBEITER DATEN 1.Mann --> <table border='0' cellpadding='1' cellspacing='1' bgcolor='#000000' width='400'> <tr> <td bgcolor='#990000' colspan='2' valign='top'><font class='tdesign01'> <b>1.Mann Mitarbeiter </td> </tr> <td bgcolor='#ffffff' valign='top' width='68'><font><b>Name:</td> <td bgcolor='#ffffff' valign='top'><font>";

      // DATENBANK QUERY

      require "config.php"; $link = mysql_connect($dbhost, $dbuser, $dbpass)         or die ("Could not connect");           mysql_select_db ($dbname)         or die ("Could not select database");

      $query= "SELECT * FROM personal WHERE personalnummer = " . $_POST['mann1'];          $result = mysql_query ($query)              or die ("Query failed");

      while($line = mysql_fetch_array($result)) {

      print $line['mit_vorname'] . ", " . $line['mit_nachname'] . "</td> </tr> <tr> <td bgcolor='#ffffff' valign='top'><font><b>Adresse:</td> <td bgcolor='#ffffff' valign='top'><font>" . $line['mit_strasse'] . ", " . $line['mit_plz'] . " " . $line['mit_ort'] . "</td> </tr> <tr> <td bgcolor='#ffffff' valign='top'><font><b>Privat-Tel:</td> <td bgcolor='#ffffff' valign='top'><font>";

      if ($line['mit_telanzeigen'] == 'nein') { print " - "; } else { print $line['mit_telprivat']; } }

      $link = mysql_connect($dbhost, $dbuser, $dbpass)         or die ("Could not connect");           mysql_select_db ($dbname)         or die ("Could not select database");

      $query= "SELECT * FROM handy WHERE handy_id = " . $_POST['mann1_handy'];          $result = mysql_query ($query)              or die ("Query failed");

      while($line = mysql_fetch_array($result)) {

      print "</td> </tr> <tr> <td bgcolor='#ffffff' valign='top'><font><b>Handy:</td> <td bgcolor='#ffffff' valign='top'><font>" . $line['handy_nummer'] . "</td>"; }

      print "</tr> <tr> <td bgcolor='#ffffff' valign='top'><font><b> Zust&auml;ndig: </td> <td bgcolor='#ffffff' valign='top'><font> " . $_POST['mann1_bereich'] . "</td> </tr> </table>

      <br /><br />

      <!-- MITARBEITER DATEN 2.Mann --> <table border='0' cellpadding='1' cellspacing='1' bgcolor='#000000' width='400'> <tr> <td bgcolor='#990000' colspan='2' valign='top'><font class='tdesign01'> <b>2.Mann Mitarbeiter </td> </tr> <td bgcolor='#ffffff' valign='top' width='68'><font><b>Name:</td> <td bgcolor='#ffffff' valign='top'><font>";

      // DATENBANK QUERY

      require "config.php"; $link = mysql_connect($dbhost, $dbuser, $dbpass)         or die ("Could not connect");           mysql_select_db ($dbname)         or die ("Could not select database");

      $query= "SELECT * FROM personal WHERE personalnummer = " . $_POST['mann2'];          $result = mysql_query ($query)              or die ("Query failed");

      while($line = mysql_fetch_array($result)) {

      print $line['mit_vorname'] . ", " . $line['mit_nachname'] . "</td> </tr> <tr> <td bgcolor='#ffffff' valign='top'><font><b>Adresse:</td> <td bgcolor='#ffffff' valign='top'><font>" . $line['mit_strasse'] . ", " . $line['mit_plz'] . " " . $line['mit_ort'] . "</td> </tr> <tr> <td bgcolor='#ffffff' valign='top'><font><b>Privat-Tel:</td> <td bgcolor='#ffffff' valign='top'><font>";

      if ($line['mit_telanzeigen'] == 'nein') { print " - "; } else { print $line['mit_telprivat']; } }

      $link = mysql_connect($dbhost, $dbuser, $dbpass)         or die ("Could not connect");           mysql_select_db ($dbname)         or die ("Could not select database");

      $query= "SELECT * FROM handy WHERE handy_id = " . $_POST['mann2_handy'];          $result = mysql_query ($query)              or die ("Query failed");

      while($line = mysql_fetch_array($result)) {

      print "</td> </tr> <tr> <td bgcolor='#ffffff' valign='top'><font><b>Handy:</td> <td bgcolor='#ffffff' valign='top'><font>" . $line['handy_nummer'] . "</td>"; }

      print "</tr> <tr> <td bgcolor='#ffffff' valign='top'><font><b> Zust&auml;ndig: </td> <td bgcolor='#ffffff' valign='top'><font> " . $_POST['mann2_bereich'] . "</td> </tr> </table>

      <br /><br />

      </td> </tr> <tr> <td bgcolor='#990000' colspan='2'><font class='tdesign01'><b>Bemerkung:</td> </tr> <tr> <td bgcolor='#ffffff' colspan='2'><font>" . $_POST['bemerkung'] . "</td> </tr> </table>"; }


      Ja wie gesagt und wenn ich dann mit :


      $to = "ich@email.de"; $subject = "MeldungKW" . $_POST['kw']; $xtra = "From: Meldung\r\n"; $xtra .= "Content-Type: text/html\r\nContent-Transfer-Encoding: 8bit\r\n"; $sendReadiness = createReadinessHTML();

      mail($to,$subject,$sendReadiness,$xtra); echo $sendReadiness;


      Mir die E-Mail zuschicken lassen will, dann schickt er mir auch eine E-Mail - auch mit korrektem Betreff - allerdings ohne Inhalt.

      ciao morpheuz

      1. Huhu morpheuz

        Deine Funktion hat keinen Rückgabwert.

        $sendReadiness = createReadinessHTML();

        Deshalb wird der Variablen $sendReadiness kein Wert zugewiesen.

        Deine Funktion sollte in etwa so ausschauen:

        function createReadinessHTML()
        {
         $contents = '';
         $contents = <<< EOT

        Für den HTML-Klops bietet sich die here doc - Schreibweise an.

        Bei Array-Elementen die geschweiften Klammern nicht vergessen.
        {$_row['vorname']}
        Und das schöne ist, dass man "" und '' nach Lust und Laune verwenden kann ohne etwas zu maskieren.

        EOT;

        $content .= 'noch was anhängen';

        return $contents;
        }

        So ungefähr jedenfalls.

        Bedenke, dass nicht alle Mailempfänger HTML-Mails auch anzeigen wollen oder können.

        Da es hier scheinbar um wichtige Informationen zu Dienstzeiten geht würde ich auf die HTML-Formatierung komplett verzichten.

        Für Werbung und anderes unnützes Zeug mag das ok sein.

        Du kannst ja zusätzlich eine HTML-Seite online stellen und den Link
        in die Mail stecken.

        Viele Grüße

        lulu

        --
        bythewaythewebsuxgoofflineandenjoytheday
        1. Hi Lulu

          Deshalb wird der Variablen $sendReadiness kein Wert zugewiesen.

          wenn ich $sendReadiness per echo ausgebe, sehe ich den kompletten und richtigen Inhalt - vielleicht doch ein anderes Problem?

          function createReadinessHTML()
          {
           $contents = '';
           $contents = <<< EOT
          EOT;
          $content .= 'noch was anhängen';
           return $contents;
          }

          Bedeutet das, dass ich in die Variabel $contents auch meine Datenbankabfragen machen kann? Das wäre mir neu - ich dachte, deswegen benutzt man Funktionen?

          ciao morpheuz

          1. Huhu morpheuz

            wenn ich $sendReadiness per echo ausgebe, sehe ich den kompletten und richtigen Inhalt - vielleicht doch ein anderes Problem?

            Die Ausgabe erfolgt ja bei Dir schon innerhalb der Funktion.
            Schreib mal
            echo '<hr>'.$sendReadiness;
            So wie ich das vermute müsste Der Inhalt _vor_ dem hr stehen.

            Oder benutze

            var_dump($sendReadiness);

            um zu prüfen was tatsächlich in dieser Variablen steht.

            Bedeutet das, dass ich in die Variabel $contents auch meine Datenbankabfragen machen kann? Das wäre mir neu - ich dachte, deswegen benutzt man Funktionen?

            Nein, das bedeutet nur dass Du Deine Ausgaben der Variablen
            $contents zuweisen musst damit Deine Funktion etwas zurückgeben kann.
            Mit Datenbankabfragen hat das rein gar nichts zu tun.
            Funktionen benutzt man um immerwiederkehrende Aufgaben zu modularisieren.

            Viele Grüße

            lulu

            --
            bythewaythewebsuxgoofflineandenjoytheday
            1. hi,

              wenn ich $sendReadiness per echo ausgebe, sehe ich den kompletten und richtigen Inhalt - vielleicht doch ein anderes Problem?

              $sendReadiness = createReadinessHTML();
              echo $sendReadiness;

              klar, dies wird eine ausgabe erzeugen - allerdings schon beim aufruf der funktion.
              die variable ist nach wie vor leer - aber auf grund eines viel zu liberal eingestellten error reportings bemerkst du es nicht.

              Die Ausgabe erfolgt ja bei Dir schon innerhalb der Funktion.

              richtig, s.o.

              Schreib mal
              echo '<hr>'.$sendReadiness;
              So wie ich das vermute müsste Der Inhalt _vor_ dem hr stehen.

              nein, das alleine erzeugt gar keine ausgabe aus einem <hr> - die variable ist und bleibt leer, und die funktion wird an dieser stelle gar nicht aufgerufen.

              echo '<hr>'.createReadinessHTML();

              dürfte aber vermutlich den von dir genannten effekt haben.

              gruß,
              wahsaga

              --
              I'll try being nicer if you'll try being smarter.
  3. hier ist etwas ganz schön durcheinander.

    1. es gibt keinen 'function inhalt', da funktionen keine objekte sind.

    2. eine funktion kann aber ein ergebnis liefern. ausgabe=funktion(eingabe)

    3. deine funktion trennt nicht zwischen datenveredelung und präsentation. sie erzeugt vielmehr jede menge html, um die ausgabe zu erstellen. sie ist eigentlich als präsentationsfunktion bestimmt.

    um den von dir gewünschten zweck zu erreichen, solltest du zwischen datenveredelung und datenpräsentation unterscheiden.
    hierfür wäre eine funktion erforderlich, welche sich nur um die daten der mail kümmmert, und die ausgabe als rückgabe hat. in einer anderen funktion könnten diese daten dann als mail präsentiert werden.

    richtig wäre hierfür eine klasse zu erstellen, welche methoden (das sind dann die funktionen) zur datenmanipulation und auch zur datenpräsentation bereitstellt.

    eine instanz dieser klasse (nennt sich dann objekt) würde alle informationen dieser mail beinhalten.
    zudem könnte mann dieses objekt serialisieren und später wiederbeleben.