php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Sonstiges > Off-Topic Diskussionen
 

Login

 
eingeloggt bleiben
star Jetzt registrieren   star Passwort vergessen
 

 

 


Off-Topic Diskussionen Kein Platz für Deine Frage gefunden? Dann bist Du hier genau richtig!

Antwort
 
LinkBack Themen-Optionen Thema bewerten
  #1 (permalink)  
Alt 04-11-2007, 21:04
brmartin
 Newbie
Links : Onlinestatus : brmartin ist offline
Registriert seit: Oct 2007
Beiträge: 24
brmartin ist zur Zeit noch ein unbeschriebenes Blatt
Standard Warum wird hier htmlentities eingesetzt?

Hallo,

Ich bin mir leider nicht sicher warum unter folgenden Bedingungen
htmlentities eingesetzt wird.

Ausgang:
Ich versuche einen Formmailer Schritt für Schritt aufzubauen.
Obwohl es viele fertige und auch anpassbare Formmailer gibt möchte
ich dies aus folgenden Gründen tun:
1. Ich bin dabei mich in PHP einzuarbeiten, es zu lernen.
2. Wirklich gute Formmailer lassen sich nur dann entsprechend anpassen
und umsetzten wenn man versteht was man tut.
3. Einfache Formmailer lassen sich nicht entsprechend anpassen
4. Ich finde ein Formmailer ist eine gute Möglichkeit sich in PHP
einzuarbeiten, da er sich eben Schritt für Schritt aufbauen läßt und die
Möglichkeit bietet jeden Schritt in ein eigenes Script zu packen und dabei
doch nicht zu unübersichtlich wird.

Wie bei Anfängern üblich stieß ich ziemlich früh auf die 1. Probleme und konnte sie mit Forumshilfe überwinden.
Wobei der Formmailer noch lange nicht fertig ist und sicher noch der ein oder andere kommt.

Jetzt habe ich momentan z.B. so ein "Hä, warum denn das?" Problem.

Zur Verdeutlichung das Ausgangsscript:
PHP-Code:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>

    <head>
        <meta http-equiv="content-type" content="text/html;charset=iso-8859-1">
        <title>Formularausgabe</title>
    </head>

    <body bgcolor="#000000">
        <p><font size="+3" color="#4b9e96"><strong>Kontaktformular </strong></font></p>
        <p><font size="+2" color="#4b9e96"><strong>Ihre Mail: </strong></font></p>
        
        <?php

$sent 
= isset($_POST['sent']) ? $_POST['sent'] : '';
$eMail = isset($_POST['eMail']) ? $_POST['eMail'] : '';
$vorname = isset($_POST['vorname']) ? $_POST['vorname'] : '';
$nachname = isset($_POST['nachname']) ? $_POST['nachname'] : '';
$betreff = isset($_POST['betreff']) ? $_POST['betreff'] : '';
$nachricht = isset($_POST['nachricht']) ? $_POST['nachricht'] : '';
if (
$sent and $eMail)
{
   global 
$eMail$vorname$nachname$betreff$nachricht;
   
   echo 
"<br><p><font color = 4b9eff size = +1 <b>Gesendet am:</b><br>";
    
$Datum date('D, d.m.Y');
      
$Uhrzeit date('H:i:s');
   echo 
"$Datum  <br>";
   echo 
"$Uhrzeit  <br><p>";
   echo 
"Von:<b> {$_POST['vorname']} </b>";
   echo 
"<b>{$_POST['nachname']}</b><br><p>"
   echo 
"Absender: <b>{$_POST['eMail']}</b><br><p>";
   echo 
"<b>Betreff: </b>{$_POST['betreff']}<br><p>";
   echo 
"<b>Ihre Nachricht:</b><br><p>";
   echo 
"{$_POST['nachricht']}</font>";     

    include (
"send.inc.php");
  } 

else {
   echo 
"Eingabe fehlt";
}   
?>
und hier das von H2O überarbeitet Script:
PHP-Code:
<?php
foreach($_POST as $key => $val){
    $
$key htmlentities($val);
}

if (!empty(
$sent) and !empty($eMail))

   
printf("<font color='#4b9eff' size='+1'><b>Gesendet am:</b><br />\n%s<br />%s<br />Von:<b>%s %s</b><br />
           Absender: <b>%s</b><br />\n<b>Betreff: %s</b><br />\n<b>Ihre Nachricht: </b><br />%s</font><br />\n"
,    
          
date('D, d.m.Y'),
          
date('H:i:s'),
          
$vorname,
          
$nachname,
          
$eMail,
          
$betreff,
          
$nachricht);
   
   include (
"send.inc.php");

else {
   echo 
"Eingabe fehlt";

?>
Fast alles kann ich nachvollziehen, nur bei:
PHP-Code:
foreach($_POST as $key => $val){
    $
$key htmlentities($val); 
bin ich mir nicht sicher.

Die foreach Schleife verstehe ich noch, nur bei
PHP-Code:
$$key htmlentities($val); 
stehe ich auf dem Schlauch.

Unklarheit:

Warum wird hier htmlentities verwendet?

Mein Problem hierbei ist nun folgendes:
Laut Manual wandelt htmlentities alle geeigeneten Zeichen in HTML-Code um.
html_entity_decode konvertiert alle html-Zeichen in ihren Uhrsprungscode.

Soweit das Manual.

Wenn ich nun
PHP-Code:
foreach($_POST as $key => $val){
    $
$key $val
auf folgende Eingabe:
"was ergibt das <b>wohl</b> Günter?"
anwende, erhalte ich als Ausgabe:
Zitat:
was ergibt das wohl Günter?
genau das selbe wie mit
PHP-Code:
foreach($_POST as $key => $val){
    $
$key html_entity_decode($val); 
nur bei
PHP-Code:
foreach($_POST as $key => $val){
    $
$key htmlentities($val); 
gibt er mir
Zitat:
was ergibt das <b>wohl</b> Günter?
aus.

Die korrekte Darstellung von ü, ä, ö zu erreichen ist einfach, in ändere im
HTML-Kopf der Seite das Charset von Iso-8859-1 auf UTF-8 und das
Problem "Günter" ist erledigt.

Wende ich nun htmlentities an, erhalte ich die selbe Ausgabe wie unter ISO-8859-1.
Ich möchte aber ä, ö,ü korrekt dargestellt haben.
das heißt ich muss zur korrekten Ausgabe von ä, ö, ü, €, usw
PHP-Code:
  $$key htmlentities($valENT_COMPAT'UTF-8'); 
anwenden, und erhalte damit:
Zitat:
was ergibt das <b>wohl</b> Günter?
Wird html_entity_decode verwendet ist die Ausgabe identisch mit $$key = $val.

Fazit:

Die Wirkungsweise und die Funktion scheine ich verstanden zu haben, aber
leider scheint mir der Grund für den Einsatz von htmlentities verborgen zu bleiben.

Kann mir bitte jemand sagen weshalb hier htmlentities angewand wird?
Ist htmletinities vielleicht eine notwendigkeit dafür wenn der Formmailer später abgesichert werden soll?

Momentan bin ich nämlich erst dabei meine Eingabefelder auf irgendeinen Inhalt hin zu überprüfen und noch nicht bei der Inhaltsprüfung.

Gruß

Martin
__________________
Greets

Martin

absolut beginner
aber lernwillig
Mit Zitat antworten
  #2 (permalink)  
Alt 04-11-2007, 22:35
tontechniker
 PHP Senior
Links : Onlinestatus : tontechniker ist offline
Registriert seit: Jul 2005
Beiträge: 1.972
tontechniker ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Kann mir bitte jemand sagen weshalb hier htmlentities angewand wird?
Weil H2O wohl nicht daran gedacht hat, dass du den HTML Code tatsächlich anzeigen willst.
__________________
Die Regeln | rtfm | register_globals | strings | SQL-Injections | []
Mit Zitat antworten
  #3 (permalink)  
Alt 05-11-2007, 01:37
brmartin
 Newbie
Links : Onlinestatus : brmartin ist offline
Registriert seit: Oct 2007
Beiträge: 24
brmartin ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Original geschrieben von tontechniker
Weil H2O wohl nicht daran gedacht hat, dass du den HTML Code tatsächlich anzeigen willst.
Ok, das währe eine Möglichkeit, die ich ehrlich gesagt nicht bedacht habe.

Ich poste mal kurz die send.inc.php5:
(Endung php5, da mein Provider der Testdomain die Endung php noch über PhP 4 phrased)
PHP-Code:
<?php

// send.inc.php

echo "send.inc.php beginnt<br>";

 if(
stripos($eMail'bcc:')){    // Minimale Kontrolle
    
die("Ung&uuml;ltige Absenderadresse, Mail nicht verschickt<br />"); 
}
echo 
"nach stripos <br>";

$absender "absender@meinedomain.tld" ;
$empfaenger "empfänger@meinedomain.tld" ;
$nachricht2 sprintf("<b>Gesendet am: </b>%s<br /><b>um: </b>%s<br /><b>von: </b>%s %s<br />
                         <b>E-Mailadresse: </b>%s<br /><b>Betreff: </b>%s<br /><b>Nachricht: </b><br>%s"
,
                    
date('D, d.m.Y'),
                    
date('H:i:s'),
                    
$vorname,
                    
$nachname,
                    
$eMail,
                    
$betreff,
                    
$nachricht);
echo 
"Headers<br>";

$headers  'From:' $absender "\r\n" ;
$headers .= 'Reply-To:' $eMail "\r\n" 
$headers .= 'X-Mailer: PHP/' phpversion() . "\r\n" 
$headers .= 'X-Sender-IP: ' $_SERVER['REMOTE_ADDR'] . "\r\n" 
$headers .= "Content-type: text/html \r\n" ;

echo 
"vor Versand<br>";

echo 
"$empfaenger<br /> $betreff<br /> $nachricht2<br />  $headers<br />";
mail($empfaenger$betreff$nachricht2,  $headers) ;

echo 
"Versandt" ;

?>
Wie du siehst, habe ich obige Probleme dann in der Mail, aber das teste ich mal durch (bisher lief nur die Ausgabe, welche mir als Kontrolle und zum Verständnis dienen soll).

Edit:
Na klasse!
Eigentlich hatte ich damit gerechnet, daß meine Mail der Browserausgabe entspricht. Aber, wies der Teufel will, dem ist nicht so.
Und was mir dabei Kopfzerbrechen bereitet ist der Betreff.

Als Betreff ($betreff) gab ich
Zitat:
ÜÜÜ
ein.
Die Browserausgabe gibt
Zitat:
ÜÜÜ
aus, ebenso die Kontrollabfrage.
In der Mail, im Header, hab ich als Betreff aber
Zitat:
&Uxml;&Uxml;&Uxml; "x"steht für u, sonst gibt mir das Forum wieder ÜÜÜ aus
stehen.
In der Mail selber wiederum korrekterweise
Zitat:
ÜÜÜ


Ohoh, ich hab noch viel Arbeit vor mir

Gruß

Martin
__________________
Greets

Martin

absolut beginner
aber lernwillig

Geändert von brmartin (05-11-2007 um 02:01 Uhr)
Mit Zitat antworten
  #4 (permalink)  
Alt 05-11-2007, 09:20
PHP-Desaster
 PHP Expert
Links : Onlinestatus : PHP-Desaster ist offline
Registriert seit: Mar 2006
Beiträge: 3.105
PHP-Desaster befindet sich auf einem aufstrebenden Ast
Standard Re: Warum wird hier htmlentities eingesetzt?

PHP-Code:
<?php
foreach($_POST as $key => $val){
    $
$key htmlentities($val);
}
Sowas solltest du dir gar nicht erst angewöhnen. Damit mimst du register_globals nach. Und weiter unten wird einfach auf die Variablen zugegriffen, egal, ob diese vorhanden sind oder nicht!
Schon alleine $$key ist ganz ganz schlechter Stil!
Da ist deine Lösung über
PHP-Code:
$sent = isset($_POST['sent']) ? $_POST['sent'] : ''
um einiges eleganter!
Mit Zitat antworten
  #5 (permalink)  
Alt 05-11-2007, 10:56
ministry
 PHP Junior
Links : Onlinestatus : ministry ist offline
Registriert seit: Jun 2006
Ort: KI / KA
Beiträge: 965
ministry ist zur Zeit noch ein unbeschriebenes Blatt
Standard

1.) Erst schreibst du die POST-Werte in eigene Variablen, gibst aber dann doch wieder die POST-Werte aus? Du kannst ja ruhig mit den POST-Werten weiterarbeiten, dann brauchst du sie aber nicht erst in eigene Variablen zu übernehmen.
2.) Wieso machst du deine erstellten Variablen global?
3.) htmlentities wird erst bei der Ausgabe angewendet, nicht zum Weiterverarbeiten. Mach einfach bei der Ausgabe
PHP-Code:
echo("Ihre Nachricht: " htmlentities($_POST['nachricht'])); 
, dann hat es sich.
4.) htmlspecialchars sollten eigentlich reichen.
__________________
ich glaube
Mit Zitat antworten
  #6 (permalink)  
Alt 05-11-2007, 12:24
brmartin
 Newbie
Links : Onlinestatus : brmartin ist offline
Registriert seit: Oct 2007
Beiträge: 24
brmartin ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Original geschrieben von ministry
2.) Wieso machst du deine erstellten Variablen global?
Das ist noch ein Überbleibsel und kommt nur im geposteten
Uhrsprungscode vor, da ich dachte die Variablen werden nich an
php.inc.send übergeben. Leider kann ich den damiligen Fehler im Code
nichtmehr nachvollziehen, die Zeile global kann ersatzlos gestrichen
werden, ich habe diesen Entwurf aber noch mit dieser Zeile gespeichert.

Zitat:
Original geschrieben von PHP Desaster
PHP-Code:
<?php
foreach($_POST as $key => $val){
    $
$key htmlentities($val);
}
Sowas solltest du dir gar nicht erst angewöhnen. Damit mimst du
register_globals nach. Und weiter unten wird einfach auf die Variablen
zugegriffen, egal, ob diese vorhanden sind oder nicht!
Schon alleine $$key ist ganz ganz schlechter Stil!
Da ist deine Lösung über
PHP-Code:
$sent = isset($_POST['sent']) ? $_POST['sent'] : ''
um einiges eleganter!
Wieder was gelernt,
wobei ich eigentlich die foreach-Schleife für eleganter hielt.
Momentan sieht die send.php so aus:
PHP-Code:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>

    <head>
        <meta http-equiv="content-type" content="text/html;charset=UTF-8">
        <meta name="Kontaktformular" content="Kontaktformular">
        <title>Titel</title>
    </head>

    <body bgcolor="#cccccc">
        <p><font size="+3" color="#4b9e96"><strong>Kontaktformular </strong></font></p>
        <p><font size="+2" color="#4b9e96"><strong>Ihre Mail: </strong></font></p>
        
        
<?php
error_reporting 
(E_ALL);
//  send5.php5

foreach($_POST as $key => $val){
       $
$key htmlentities($valENT_COMPAT'UTF-8');
}


if (empty(
$vorname)) {
   echo 
'<p><font size="+2" color="#4b9e96">
<a href="javascript:history.back()"
>Vorname fehlt! <br>Bitte hier klicken</a></font></p>'
;
}

elseif (empty(
$eMail)) {
   echo 
'<p><font size="+2" color="#4b9e96">
<a href="javascript:history.back()"
>Ihre E-Mailadresse fehlt!<br>Bitte hier klicken</a></font></p>'
;
}

elseif (empty(
$betreff)) {
   echo 
'<p><font size="+2" color="#4b9e96">
<a href="javascript:history.back()"
>Sie haben keinen Betreff angegeben!<br>Bitte hier klicken</a></font></p>'
;
}

elseif (empty(
$nachricht)) {
   echo 
'<p><font size="+2" color="#4b9e96">
<a href="javascript:history.back()"
>Sie haben keine Nachricht geschrieben!<br>Bitte hier klicken</a></font></p>'
;
}
else {

$nachrichtumbruch wordwrap ($nachricht70"<br>");



switch (
$empfaenger)
  {
   case 
1
       
$empfaenger "Empfänger1@meineDomain.tld";
       break;

   case 
2:
       
$empfaenger "Empfänger2@meineDomain.tld";
       break;

   case 
3:
      
$empfaenger "Empfänger3@meineDomain.tld";
      break;

   case 
4
      
$empfaenger "Empfänger4@meineDomain.tld";
      break;

   default:
      echo 
"Fehler! kein Empfänger";
}

 
printf("<font color='#4b9eff' size='+1'><b>Gesendet am:</b><br />\n%s<br />%s<br /><p></<p>
            <b>Von: </b>%s %s<br /><p></<p><b>Absender: </b>%s<br />\n<p></p>
            <b>An: </b>%s<br />\n<p></p><b>Betreff:  </b>%s<br />\n<p></p>
            <b>Ihre Nachricht: </b><p></p><br />%s</font><br />\n"
,    
          
date('D, d.m.Y'),
          
date('H:i:s'),
          
$vorname,
          
$nachname,
          
$eMail,
          
$empfaenger,
          
$betreff,
          
$nachrichtumbruch);



    include (
"send.inc.php5");
// Ende elsif

?>        
        <p><font size="+2" color="#4b9e96"><a href="javascript:history.back()">zur&uuml;ck</a></font></p>
    </body>

</html>
Errorreporting ist natürlich an.
Im Formular wurde eine Auswahlliste des Empängers eingebaut.
Die Eingabefelder (bis auf nachname) werden daraufhin überprüft ob sie einen Inhalt haben,
im nächsten Schritt will ich dann den Inhalt selbst noch prüfen.
Hier empfand ich die foreach-Schleife eigentlich als elegante Lösung.

Naja, dann wird heute mittag wieder umgeschriegeben und das Array aufgelöst.

Was mich zuerst verwirrte war eine Anmerkung von H2O:
Zitat:
Original geschrieben von H2O
...
Dann machst du aus deinen Post-Variablen normale lokale Variable.
Gib doch gleich diese aus, statt wieder $_POST zu bemühen.
Und in der send.inc.php weist du diese Variablen, die du ja schon hast, wieder zu.
...
Der Satz blieb mir im Gedächtnis, aber gerade fällt mir auf, daß ich in der
Ursprünglichen send.inc.php noch
PHP-Code:
$eMail $_REQUEST['eMail'] ; 
stehen hatte was in Verbindung mit den isset Überprüfungen und
Zuweisung natürlich doppelt gemoppelt wäre und sich seine Aussage darauf bezog.

Ich habe das jetzt so verstanden:

Da ich eine Browserausgabe der im Formular eingetragenen Daten möchte,
ist es Sinnvoll mein $_POST Array zu beginn aufzulösen und den Inhalt in
lokale Variablen zu schreiben.
Das $_POST Array bleibt im weiteren Verlauf ungenutzt, denn ich habe ja
jetzt meine einzelnen Variablen (hmm, dann könnte ich das Array doch
eigentlich löschen).
Zur Weiterverarbeitung, ob nun Prüfung oder Ausgabe, bzw. beides
werden nur noch die lokalen Variablen genutzt.
htmlentities, bzw. htmlspecialchars werden direkt zur Ausgabe angewandt.
Sprich wenn ich will daß im Betreff keine html-Zeichen sind wedne ich
htmlentities, oder htmlspecialchars erst bei der Ausgabe an und nur auf die
betreffende Variable.

Einen Grund weshalb htmlentities verwendet wurde, gibt es eigentlich
nicht, außer eben zur Darstellung der html- Tags.

besten Dank!
__________________
Greets

Martin

absolut beginner
aber lernwillig
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an


PHP News

ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlicht
ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlichtDie bekannte Marktplatzsoftware ebiz-trader ist in der Version 7.5.0 veröffentlicht worden.

28.05.2018 | Berni

Wissensbestand in Unternehmen
Wissensbestand in UnternehmenLebenslanges Lernen und Weiterbilden sichert Wissensbestand in Unternehmen

25.05.2018 | Berni


 

Aktuelle PHP Scripte

ADSMAN V3 - Werbe-Manager ansehen ADSMAN V3 - Werbe-Manager

ADSMAN V3 - mehr als nur ein Bannermanager! Banner, Textanzeigen und PagePeel Manager! Mit ADSMAN PRO haben Sie die Marketinglösung für eine effektive und effiziente Werbeschaltung mit messbaren Ergebnissen. Unterstützt werden Bannerformate in beliebi

25.10.2018 virtualsystem | Kategorie: PHP/ Bannerverwaltung
PHP News und Artikel Script V2

News schreiben, verwalten, veröffentlichen. Dies ist jetzt mit dem neuen PHP News & Artikel System von virtualsystem.de noch einfacher. Die integrierte Multi-User-Funktion und der WYSIWYG-Editor (MS-Office ähnliche Bedienung) ermöglichen...

25.10.2018 virtualsystem | Kategorie: PHP/ News
Top-Side Guestbook

Gästebuch auf Textbasis (kein MySQL nötig) mit Smilies, Ip Sperre (Zeit selbst einstellbar), Spamschutz, Captcha (Code-Eingabe), BB-Code, Hitcounter, Löschfunktion, Editierfunktion, Kommentarfunktion, Kürzung langer Wörter, Seiten- bzw. Blätterfunktion, V

22.10.2018 webmaster10 | Kategorie: PHP/ Gaestebuch
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 13:44 Uhr.