Sophie: Ausgabe PHP Array

Hallo,

was mache ich falsch? Hier mein Quelltext

$mytext1 	  = array();
$mytext2 	  = array();
$mytext3 	  = array();

$mytext1 	  = $_POST["mytext1"];
$mytext2 	  = $_POST["mytext2"];
$mytext3 	  = $_POST["mytext3"];
	
$projekt 	  = $_POST["bezeichnung"];
$besteller 	= $_POST["name"];
	
$von 	 	    = $_POST["p_von"];
$bis 	 	    = $_POST["p_bis"];

Dann baue ich eine eMail zusammen, dieses mache ich so

$data['html'] = '
		<html>
	    <head>
	      <title>'.$data['subject'].'</title>
	    </head>
	    <body>
	      <div>
	        <p><strong>Projekt:</strong><br>'.$projekt.'</p>
	        <p><strong>Besteller:</strong><br>'.$besteller.'</p>
	        <p><strong>Zeitraum:</strong><br>'.$von . " - " .$bis.'</p>
	        <h3>Arbeitskleidung</h3>';

	        for($i = 0; $i < count($mytext1); $i++){ 

		      $data['html'] .= '

		        <p>'. $mytext1 ." x". " - ". $mytext2 . " - ". $mytext3 .'</p>

		        ';
	    	}

	        $data['html'] .= '
	        -- <br>
	        Impressum gemäß § 5 TMG<br><br>
         </div>
	     </body>
    </html>';

Als Ergebnis erhalte ich folgende Ausgabe in der Mail

Array x - Array - Array

Und auf der Webseite erhalte ich folgende Notice

Notice: Array to string conversion

Dann habe ich noch eine Frage zu htmlspecialchars werden diese in einer Mail auch benötigt? Ich meinte da wird ja nichts auf einer Webseite ausgegeben nur in meinem Mail-Programm?

  1. Hallo,

    Notice: Array to string conversion

    hab den Fehler gefunden

    Aus dieser Zeile

    <p>'. $mytext1 ." x". " - ". $mytext2 . " - ". $mytext3 .'</p>
    

    muss dieses werden

    <p>'. $mytext1[$i] ." x  - ". $mytext2[$i] . " - ". $mytext3[$i] .'</p>
    
    1. Hello,

      Welche PHP-Version benutzt Du?

      Das passt von vorne bis hinten noch nicht zusammen.
      Das Umkopieren der $_POST-Variablen ist in dieser Form unnötig.
      Das Vorhandensein sollte man aber prüfen, bevor man sie verwendet.

      Solange Du die Werte in den Plaintext-Mailbody schreibst, sollte eine spezielle Kontextbehandlung mMn nicht notwendig sein. Geraten die externen Werte aber irgendwie in die Mailheader, wird es gefährlich.

      Die einzige Sequenz, die mMn nicht enthalten sein darf in den Werten, wäre "End of Mail" (\r\n\r\n.). Dann wäre die Mail an dieser Stelle zuende. Das habe ich jetzt aber noch nicht genauer untersucht, also unter Vorbehalt.

      Liebe Grüße
      Tom S.

      --
      Es gibt nichts Gutes, außer man tut es
      Andersdenkende waren noch nie beliebt, aber meistens diejenigen, die die Freiheit vorangebracht haben.
      1. Hallo Tom S.,

        Welche PHP-Version benutzt Du?

        Ich nutze die PHP Version 7.0.20-nmm1

        Das passt von vorne bis hinten noch nicht zusammen.

        Was passt denn hier vorne und hinten nicht zusammen? Ich glaube du übertreibst etwas? ;) Immerhin kommen meine Mails bei mir an.

        Das Umkopieren der $_POST-Variablen ist in dieser Form unnötig.

        Doch, ich halt es für nötig, denn a) arbeite ich mit diesen Variablen auf der Seite weiter und b) wenn ich die Felder ändere muss ich die Änderungen nur einmal durchführen und nicht an zick verschiedenen Stellen.

        Das Vorhandensein sollte man aber prüfen, bevor man sie verwendet.

        Die sollten immer vorhanden sein, denn das sind Pflichtfelder :)

        1. Hello,

          Welche PHP-Version benutzt Du?

          Ich nutze die PHP Version 7.0.20-nmm1

          Das dachte ich mir. Deshalb hast Du die Typwarungen erhalten.

          Du deklarierst deine Variablen $mytext1 usw. als array(), schreibst dann aber einen String hinein.

          Das passt von vorne bis hinten noch nicht zusammen.

          Was passt denn hier vorne und hinten nicht zusammen? Ich glaube du übertreibst etwas? ;) Immerhin kommen meine Mails bei mir an.

          Nur weil etwas vermeintlich funktioniert, muss es noch lange nicht richtig sein. ;-)

          Das Umkopieren der $_POST-Variablen ist in dieser Form unnötig.

          Doch, ich halt es für nötig, denn a) arbeite ich mit diesen Variablen auf der Seite weiter und b) wenn ich die Felder ändere muss ich die Änderungen nur einmal durchführen und nicht an zick verschiedenen Stellen.

          Verstehe ich nicht. Die Änderungen können doch auch direkt in $_POST[' ... '] vorgenommen werden. Oder brauchst Du die originalen Postwerte später noch? Dann würde ich die aber trotzdem auch für die interne Verarbeitung im Skript als Array zusammenhalten!

          Das Vorhandensein sollte man aber prüfen, bevor man sie verwendet.

          Die sollten immer vorhanden sein, denn das sind Pflichtfelder :)

          Ach so? Ich schreibe das ja nicht, weil ich Dich ärgern will, sondern weil ich weiß, dass das auch anders geht! Wo hast Du denn das Vorhandensein und das Format der Pflichtfelder überprüft? Zeigst Du uns die Stelle noch?

          
          Noch ein weiterer ganz kostenloser Tipp von mir:  
          Wenn Dir hier jemand etwas antwortet, denk erstmal darüber nach, bevor Du auf die Barrikaden gehst. Auch wenn nur ein Teil der Antwort für dich im Moment wichtig und richtig sein sollte, kommen die meisten Tipps aus der Praxis und manchmal auch eigenen bösen Erfahrungen. :-)  
          
          
          
            
          Liebe Grüße  
          Tom S.   
          
          
          -- 
           Es gibt nichts Gutes, außer man tut es   
           Andersdenkende waren noch nie beliebt, aber meistens diejenigen, die die Freiheit vorangebracht haben.  
          
          
          
          
          
          
          
          1. Hallo TS,

            Du deklarierst deine Variablen $mytext1 usw. als array(), schreibst dann aber einen String hinein.

            "Deklarieren" - hm, nette Formulierung. Ich dachte in PHP deklariert man nicht. Die Zeile ist schlicht unnötig.

            WieAuchImmer, wenn das Form, wo die Daten herkommen, eine Eingabetabelle hatte und ein [] im name Attribut der Input Elemente steht, dann STEHT da ein Array drin.

            Die sollten immer vorhanden sein, denn das sind Pflichtfelder :)

            Ach so? Ich schreibe das ja nicht, weil ich Dich ärgern will, sondern weil ich weiß, dass das auch anders geht! Wo hast Du denn das Vorhandensein und das Format der Pflichtfelder überprüft? Zeigst Du uns die Stelle noch?

            Der Code an sich ist doch irrelevant. Der wichtige Hinweis ist, dass er da sein muss und man sich nicht auf Pflichtfeld-Validierung aus HTML verlassen darf, weil die umgangen werden kann. Wenn Sophie den Code gebaut hat, ist der Rest ein für das Thema hier unwichtiges Detail. Nicht jede Frage muss ein Lehrstück werden, und es ist auch durchaus sinnvoll, nicht jede Code-Einzelheit zu posten, wenn man zu einem Teilbereich eine Frage hat.

            Rolf

            --
            Dosen sind silbern
    2. (Edit: Parallelpost zu TS)

      Hallo Sophie,

      danke für die Rückmeldung, dass keiner mehr gucken braucht.

      Aber zu deinem folgendem Code hätte ich ein paar Hinweise. Nimm sie oder lass sie, wie Du magst. Bis auf den ersten, der ist ggf. kritisch.

      Zu allererst solltest Du den Inhalt der $_POST Variablen nicht 1:1 in die Mail übertragen, es sei denn, du kannst auf Grund anderer Umstände dafür garantieren, dass hier niemand etwas bösartiges injiziert. Ohne diese Garantie musst Du die Post-Werte mit htmlspecialchars() absichern.

      $mytext1 	  = array();
      $mytext1 	  = $_POST["mytext1"];
      
      • Eine "Doppelinitialisierung" von Variablen ist nur in Ausnahmefällen nötig. Sowas machte man zu Assemblerzeiten, wo ein Speicherbereich ggf. nicht vollständig durch einen Schreibbefehl gefüllt wurde, und man ihn deshalb vorher initialisiert hat. In deinem Fall vergeudest Du durch die erste Zuweisung nur Laufzeit.
      • Seit PHP 5.4 kann man ein Array auch mit der [] Notation aufschreiben, also
      $mytext1 = [];
      $myfoo2 = [ 4, 7, 1, 1, "kölnisch" => "wasser" ];
      

      Das ist wirklich nur gesparte Tipparbeit. Array() ist ein Sprachkonstrukt, keine Funktion, daher sollte das unter der Haube exakt das gleiche tun.

      Viel Spaß noch
      Rolf

      --
      Dosen sind silbern
      1. Hello,

        Zu allererst solltest Du den Inhalt der $_POST Variablen nicht 1:1 in die Mail übertragen, es sei denn, du kannst auf Grund anderer Umstände dafür garantieren, dass hier niemand etwas bösartiges injiziert. Ohne diese Garantie musst Du die Post-Werte mit htmlspecialchars() absichern.

        Wieso sollen die Werte für den Plain-Text-Kontext so vorbehandelt werden, als würden sie im HTML-Kontext benutzt werden? Das verstehe ich jetzt nicht!

        Das einzige, was man ggf. anpassen muss, ist die Kodierung.
        Und ob ein "Single Dot" Probleme machen könnte, überschaue ich jetzt nicht freihändig.

        Liebe Grüße
        Tom S.

        --
        Es gibt nichts Gutes, außer man tut es
        Andersdenkende waren noch nie beliebt, aber meistens diejenigen, die die Freiheit vorangebracht haben.
        1. Hallo TS,

          Sophie erzeugt eine HTML Mail. Deswegen muss sie den Kontextwechsel zu HTML beachten. Oder versteh ich was falsch?

          Rolf

          --
          Dosen sind silbern
          1. Hello,

            Sophie erzeugt eine HTML Mail. Deswegen muss sie den Kontextwechsel zu HTML beachten. Oder versteh ich was falsch?

            Ok, die Aussage verschiebe ich in eine andere Frage ;-)

            Im HTML-Kontext muss selbstverständlich passend maskiert werden.

            Das ändert aber nichts an der Richtgigkeit meiner Antwort, passend zu einer Plain-Text-Mail, die leider aber nichts mit dieser Frage zu tun hatte. :-O

            Liebe Grüße
            Tom S.

            --
            Es gibt nichts Gutes, außer man tut es
            Andersdenkende waren noch nie beliebt, aber meistens diejenigen, die die Freiheit vorangebracht haben.
      2. Tach!

        Zu allererst solltest Du den Inhalt der $_POST Variablen nicht 1:1 in die Mail übertragen, es sei denn, du kannst auf Grund anderer Umstände dafür garantieren, dass hier niemand etwas bösartiges injiziert. Ohne diese Garantie musst Du die Post-Werte mit htmlspecialchars() absichern.

        Auch nicht bösartig verwendete Sonderzeichen erzeugen Fehler, wenn sie als Code interpretiert werden, aber nur Text sein sollen. Es kommt nicht auf die Art einer Absicht an, sondern dass am Ende syntaktisch korrekter Code entsteht. Deshalb ist im HTML-Kontext, egal ob der im Browser oder einer Mail oder sonstwo verwendet wird, immer htmlspecialchars() zu verwenden oder anderweitig dafür zu sorgen, dass HTML-Sonderzeichen korrekt maskiert werden.

        dedlfix.

        1. Hello,

          Deshalb ist im HTML-Kontext, egal ob der im Browser oder einer Mail oder sonstwo verwendet wird, immer htmlspecialchars() zu verwenden oder anderweitig dafür zu sorgen, dass HTML-Sonderzeichen korrekt maskiert werden.

          Wo ist denn in einer Plain-Text-Mail HTML-Kontext vorhanden?
          Da wäre htmlspecialchars() garantiert nicht mein Mittel der Wahl!

          Liebe Grüße
          Tom S.

          --
          Es gibt nichts Gutes, außer man tut es
          Andersdenkende waren noch nie beliebt, aber meistens diejenigen, die die Freiheit vorangebracht haben.
          1. Tach!

            Wo ist denn in einer Plain-Text-Mail HTML-Kontext vorhanden?

            Wo ist denn da eine Plain-Text-Mail?

            Dann baue ich eine eMail zusammen, dieses mache ich so

            $data['html'] = '
            		<html>
            	    <head>
            

            dedlfix.

            1. Hello,

              Wo ist denn da eine Plain-Text-Mail?

              Dann baue ich eine eMail zusammen, dieses mache ich so

              $data['html'] = '
              		<html>
              	    <head>
              

              Ich habe die Antwort schon zurückgezogen :-O

              Für HTML-Mails muss man selbstverständlich auch die passende Maskierung vornehmen...

              Liebe Grüße
              Tom S.

              --
              Es gibt nichts Gutes, außer man tut es
              Andersdenkende waren noch nie beliebt, aber meistens diejenigen, die die Freiheit vorangebracht haben.