php array und ich.
puschelchen
- php
0 dedlfix
Hallo,
ich hab ein Formular erstellt das funktioniert auch einiger maßen bis auf
VornameNachname.txt
ihr dürft euch den Code ansehen.
ja ich hab schonma in paar Foren gepostet aber mir hilft keiner wie ich das umsetzen soll und ich hab schon alles was ich weis versucht.
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>Supportinfo</title>
<style type="text/css">
.toFill {
border: 1px solid red;
}
</style>
</head>
<body background="hintergrundfertig.png" alt="Bild">
<form action="" method="POST">
<div align="right" style="position:absolute;top:190px; right:10px;"><font color="yellow"><b>
<?php
ob_start();
setlocale(LC_TIME, "de_DE");
date_default_timezone_set("Europe/Berlin");
$pflichtfelder = array("Vorname", "Nachname","Email","Betreff",);
$values = array();
$found = array();
$mail= array();
$text = array();
$Text=("Hallo");
if (!array_key_exists("speichern", $_POST)){
$found = $pflichtfelder;
foreach ($pflichtfelder as $name){
$values[$name] = "";
}
}
else {
$ok = true;
foreach ($pflichtfelder as $name){
if (array_key_exists($name, $_POST) && $_POST[$name]){
array_push($found, $name,$mail,$text);
$values[$name] = $_POST[$name];
$Datei=$pflichtfelder.$pflichtfelder.".txt";
$FilePointer = fopen($Datei, "w");
fwrite($FilePointer, $Text);
fclose($FilePointer);
}
else {
$ok = false;
$values[$name] = "";
}
}
if (!$ok) echo '<script type="text/javascript">alert("Bitte alle Felder ausfüllen!");</script>';
}
foreach ($pflichtfelder as $name){
echo $name . ': <input name="' . $name . '" value="' . $values[$name] . '"';
if (array_search($name, $found) === false) {
echo ' class="toFill"';
}
echo "><br>\n";
}
?>
<textarea name="Nachricht" cols="40" rows="20"></textarea><br />
<input name="speichern" value="speichern" type="submit"><input type="reset" value="abbrechen">
</div>
</form>
</body>
</html>
Danke für eure hilfe
Hi!
ich hab ein Formular erstellt das funktioniert auch einiger maßen bis auf
VornameNachname.txt
[...]
Danke für eure hilfe
Beschreibe bitte dein Problem. An welcher Stelle genau erwartest du beispielweise welchen Wert in welcher Variable oder welches Verhalten einer Funktion und inwieweit weicht das von deinen Vorstellungen und den Beschreibungen im Handbuch ab?
Lo!
mein Array ist leer. bzw ich muss $vorname=$_PST['variable'] übergeben aber mein Script funktioniert nicht wie ich es will..
hat jemand ne Idee wie ichs umsetzen könnte das dort nich array ('vorname''nachname' etc steht sondern $vorname also quasi das was der Benutzer einschreibt?
Hi!
mein Array ist leer. bzw ich muss $vorname=$_PST['variable'] übergeben aber mein Script funktioniert nicht wie ich es will..
Welches Array genau? Und warum musst du was übergeben? PHP hat bereits alles mögliche aus dem Request extrahiert und stellt es dir gebrauchsfertig in $_POST etc. zur Verfügung. Da musst du nichts übergeben oder übernehmen, sondern einfach nur an den Stellen, an denen du den Wert benötigst, lesend darauf zugreifen.
hat jemand ne Idee wie ichs umsetzen könnte das dort nich array ('vorname''nachname' etc steht sondern $vorname also quasi das was der Benutzer einschreibt?
Wo "dort"? Bitte versuch genau hinzusehen und genau zu beschrieben.
Lo!
das array wo steht $pflichtfelder= array('vorname','nachname','Email','betreff)
denn weiter unten will ich ne datei schreiben in der prüfung die soll heissen: hans_müller_datum_uhrzeit.txt und das will ich so definieren:$datei= $pflichtfelder.$pflichtfelder.date.time.".txt"; nur das Pflichtfelder ja das Vorname etc enthält
und wo soll ich sonst die daten herbekommen die der Benutzer einträgt`?
Hi!
das array wo steht $pflichtfelder= array('vorname','nachname','Email','betreff)
denn weiter unten will ich ne datei schreiben in der prüfung die soll heissen: hans_müller_datum_uhrzeit.txt und das will ich so definieren:$datei= $pflichtfelder.$pflichtfelder.date.time.".txt"; nur das Pflichtfelder ja das Vorname etc enthält
$pflichtfelder ist ein Array. Wenn du das einfah so in einen String-Kontext bringst, kommt da nur das Wort 'Array' raus. Aus allen Werten des Arrays einen String zu erzeugen geht unter anderem mit der Funktion implode(). Aber du willst eigentlich gar nicht das Array $pflichtfelder nehmen, denn das enthält nur die Feldnamen und nicht die Inhalte. Diese trägst du in $values ein, also müsstest du daraus den Dateinamen generieren, oder nicht?
und wo soll ich sonst die daten herbekommen die der Benutzer einträgt`?
Brauchst du jetzt einen PHP-Grundlagenkurs, der dir sagt, wie du an die Daten aus den Input-Feldern kommst?
Insgesamt sieht dein Code (abgesehen von den nicht vorhandenen Einrückungen, die der Lesbarkeit stark abträglich sind) so aus, als ob du einfach mal was machst, aber gar nicht genau weißt, was dabei rauskommt. Du solltest dir ein paar Debugging-Fähigkeiten zulegen, damit du nachvollziehen kannst, was wann wo steht, um so deinen Wunsch mit der Wirklichkeit vergleichen zu können. Mitunter reicht ein einfaches echo $var, um sich den Inhalt von $var anzeigen zu lassen, aber deutlich genauer ist die Funktion var_dump(). Diese erzeugt immer eine Ausgabe, auch bei nicht sichtbaren Inhalten, wie Leerstring oder null. Zudem solltest du beim Entwickeln immer das error_reporting auf E_ALL (und display_errors auf on) stellen, damit dir Zugriffe auf nicht vorhandene Variablen angezeigt werden. Solch ein Zugriff deutet üblicherweise auf einen Fehler hin, auch wenn PHP das nicht so eng sieht.
Noch drei Anmerkungen
<div align="right" style="position:absolute;top:190px; right:10px;"><font color="yellow"><b>
Warum schreibst du die Farbe und das Fett nicht ebenfalls als CSS-Eigenschaften? Seit die CSS-unfähigen Browser ausgestorben sind, besteht noch nicht mal mehr die Notwendigkeit, sich zu erinnern, dass es das font-Element jemals in HTML gab.
if (array_key_exists($name, $_POST) && $_POST[$name]){
Teste lieber mit isset($_POST[$name]) statt mit array_key_exists(), denn das ist einfacher zu lesen und kürzer zu tippen. Mit dem && $_POST[$name] möchtest du sicher einen von Leerstring verschiedenen Inhalt testen. So notiert ist das aber kein Stringtest sondern ein Test auf boolschen Inhalt. Das ist eigentlich kein Problem, weil PHPs automatische Typumwandlung zum tragen kommt. Du bringst aber deine Intention deutlicher einfacher rüber, wenn du nicht solche Um-die-Ecke-Denk-Konstrukte verwendest, sonder eher auf die Stringlänge prüfst. In deinem Fall kannst du aber das gesamte Konstrukt durch ein
if (!empty($_POST[$name]))
ersetzen, das vereint die isset()- mit der Nicht-Leer-Prüfung.
array_push($found, $name,$mail,$text);
array_push() ist eigentlich auch eine Funktion, die man zugunsten der "$array[] = wert"-Schreibweise meiden sollte. In deinem Fall bringt sie jedoch einen kleinen Vorteil, weil du nur eine statt drei Zeilen notieren muss. Aber willst du wirklich die Inhalte aus $name, $mail und $text in $found ablegen? Wenn ich nichts übersehen habe, ist da jeweils nur ein leeres Array drin abgelegt.
Versuch doch auch noch deinen Code mit Kommentaren zu versehen. Kommentiere aber nicht, was der Code macht - denn das sieht man - sondern was deine Intention ist, was du jeweils beabsichtigst. Den Code allein zu betrachten, bringt nicht unbedingt alle Fehler zu Tage. Einige gravierende Dinge kann man sicher auf Anhieb erkennen, aber nicht immer kann man zweifelsfrei sehen, was Absicht und was Fehler ist.
Und als Abschluss sei auch dir die Lektüre des Kontextwechsel-Artikels empfohlen, denn du zeigst einen der häufigsten sicherheitsrelevanten Programmierfehler beim Einfügen von Variableninhalten in andere Kontexte. Speziell ist es bei dir das Erzeugen der HTML-Elemente des Formulars sowie das Zusammenbauen des Dateinamens aus Benutzereingaben. Man muss da nur mal ein paar ../ und noch ein paar Pfadeingaben einbauen und kann alle erreichbaren und auf .txt endenden Dateien überschreiben.
Lo!
Naja mein Alter Code hat funktioniert bis auf das Felder umranden mit Farbe
<?php
error_reporting( -1 );
ini_set('display_errors', TRUE);
ob_start();
setlocale(LC_TIME, "de_DE");
date_default_timezone_set("Europe/Berlin");
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<style type="text/css">
<!--
.text {
position: relative;
margin-top: 160px;
height: 160px;
font-color: yellow;
}
.toFill {
border: 1px solid red;
}
-->
</style>
<title>Supportinfo</title>
</head>
<body background="hintergrundfertig.png" alt="Bild">
<form action="<?php echo $_SERVER['SCRIPT_NAME']; ?>" method="post">
<div align="right" style="position:absolute;top:190px; right:0px;"><font color="yellow"><b>
Nachname:<input type="text" name="Nachname" size="50" /><br />
Vorname:<input type="text" name="Vorname" size="50" /><br />Betreff:<input type="text" name="Betreff" size="50" /><br />
<textarea name="Nachricht" cols="60" rows="20"></textarea><br />
<input type="submit" value="Senden" /><input type="reset" value="Abbrechen" />
</div>
</form>
<?php
if(isset($_POST['Nachname']))
{
$komplett= true;
$Email =$_POST['Email'];
$Betreff = $_POST['Betreff'];
$Nachricht = $_POST['Nachricht'];
$Nachname = $_POST['Nachname'];
$Vorname = $_POST['Vorname'];
$Datum = date('d-m-y');
$Uhrzeit = date('h-i-s');
$Trennzeichen= ("_");
$Leerzeichen = (" ");
$Datei = $Vorname.$Trennzeichen.$Nachname.$Trennzeichen.$Datum.$Trennzeichen.$Uhrzeit.".txt";
$Text = $Vorname.$Leerzeichen. $Nachname.$Leerzeichen. $Email.$Leerzeichen.$Datum.$Leerzeichen. $Uhrzeit.$Leerzeichen.$Betreff.$Nachricht;
if ($Email == "" Or $Betreff == "" Or $Nachricht == "" Or $Nachname=="" Or $Vorname=="" )
{$komplett = false ;
?>
<script type="text/javascript">
alert("Bitte Fuellen Sie Alle Felder aus.");
<?php echo ' class="toFill"';
?>
//var inputs = document.getElementsByTagName("input");
//for(var i=0; i<inputs.length; i++) {
// var input = inputs[i];
// if(input.value == "") {
// input.style.border = "1px solid #f00";
// }
<?php
}
?>
</script>
<?php if ($komplett)
{
$FilePointer = fopen($Datei, "w");
fwrite($FilePointer, $Text);
fclose($FilePointer);
}
if(file_exists($Datei))
{
?>
<script type="text/javascript">
alert("Ihre Email wurde versendet.");
</script>
<?php
}
}
?>
<script type="javascript">
<STYLE type="text/css">
.okButton {
background-color: #D4D4D4;
font-color: #000000;
font-size: 9pt;
font-family: arial;
width: 70px;
height: 20px;
}
.alertTitle {
background-color: #3C56FF;
font-family: arial;
font-size: 9pt;
color: #FFFFFF;
font-weight: bold;
}
.alertMessage {
font-family: arial;
font-size: 9pt;
color: #000000;
font-weight: normal;
}
.alertBoxStyle {
cursor: default;
filter: alpha(opacity=90);
background-color: #E4E4E4;
position: absolute;
top: 200px;
left: 200px;
width: 100px;
height: 50px;
visibility:hidden; z-index: 999;
border-style: groove;
border-width: 5px;
border-color: #FFFFFF;
</STYLE>
<div id="alertLayer" class=alertBoxStyle></div>
<SCRIPT LANGUAGE="JavaScript">
function BrowserCheck() {
var b = navigator.appName;
if (b == "Netscape") this.b = "NS";
else if (b == "Microsoft Internet Explorer") this.b = "IE";
else this.b = b;
this.v = parseInt(navigator.appVersion);
this.NS = (this.b == "NS" && this.v>=4);
this.NS4 = (this.b == "NS" && this.v == 4);
this.NS5 = (this.b == "NS" && this.v == 5);
this.IE = (this.b == "IE" && this.v>=4);
this.IE4 = (navigator.userAgent.indexOf('MSIE 4')>0);
this.IE5 = (navigator.userAgent.indexOf('MSIE 5')>0);
if (this.IE5 || this.NS5) this.VER5 = true;
if (this.IE4 || this.NS4) this.VER4 = true;
this.OLD = (! this.VER5 && ! this.VER4) ? true : false;
this.min = (this.NS||this.IE);
}
is = new BrowserCheck();
alertBox = (is.VER5) ? document.getElementById("alertLayer").style
: (is.NS) ? document.layers["alertLayer"]
: document.all["alertLayer"].style;
function hideAlert(){
alertBox.visibility = "hidden";}
function makeAlert(aTitle,aMessage){
document.all.alertLayer.innerHTML = "<table border=0 width=100% height=100%>" +
"<tr height=5><td colspan=4 class=alertTitle>" + " " + aTitle + "</td></tr>" +
"<tr height=5><td width=5></td></tr>" +
"<tr><td width=5></td><td width=20 align=left><img src='alert.gif'></td><td align=center class=alertMessage>" + aMessage + "<BR></td><td width=5></td></tr>" +
"<tr height=5><td width=5></td></tr>" +"<tr height=5><td width=5></td></tr></table>";
//thisText = aMessage.length;
thisText = 2000
if (aTitle.length > aMessage.length){ thisText = aTitle.length; }
aWidth = (thisText * 5) + 80;
aHeight = 100;
if (aWidth < 150){ aWidth = 200; }
if (aWidth > 350){ aWidth = 350; }
if (thisText > 60){ aHeight = 110; }
if (thisText > 120){ aHeight = 130; }
if (thisText > 180){ aHeight = 150; }
if (thisText > 240){ aHeight = 170; }
if (thisText > 300){ aHeight = 190; }
if (thisText > 360){ aHeight = 210; }
if (thisText > 420){ aHeight = 230; }
if (thisText > 490){ aHeight = 250; }
if (thisText > 550){ aHeight = 270; }
if (thisText > 610){ aHeight = 290; }
alertBox.width = aWidth;
alertBox.height = aHeight;
alertBox.left = (document.body.clientWidth - aWidth)/2;
alertBox.top = (document.body.clientHeight - aHeight)/2;
alertBox.visibility = "visible";
}
// WHEN YOU WANT TO GENERATE AN ALERT DO THIS:
// CALL THE makeAlert FUNCTION AND PASS THE ALERT TITLE AND THE MESSAGE
// TO THE FUNCTION.
// eg. makeAlert('My Alert Title' , 'My Alert Message');
</SCRIPT>
</body>
</html>
Und beim anderen geht das halt.
Hello,
Naja mein Alter Code hat funktioniert bis auf das Felder umranden mit Farbe
Das ist ja ein grausamer Kot.
Keine Trennung von Eingabe, Verarbeitung und Ausgabe.
Keine (sinnvolle) Überprüfung der Eingabewerte.
Keine Strukturierung in Funktionen, die man dann Datenhaltung, Programmlogik und Anzeige zuordnen könnte.
Keine Sicherheit beim Speichern der Daten. Es wurde keine Rücksicht auf konkurrierenden Betrieb genommen.
Keinerlei Dokumentation. Funktionsbeschreibung und Kommentare gehören immer dazu, zumindest, wenn man mit Anderen über sein Projekt reden will.
Na und dann noch die diversen handwerklichen Fehler:
Keine Trennung von Markup und Style
Kein valides XHTML, obwohl es dem Browser versprochen wird...
Und in Punkto Sicherheit glaube ich fast, dass man mit etwas Geduld und Überlegung Deinen gesamten Server schreddern könnte. Benutzereingaben direkt (ohne Transformation und/oder Überprüfung) zur Erstellung eines Pfades im Filesystem zu benutzen und diesen dann auch noch mit schreibender Berechtigung zu benutzen, das ist schon ganz schon irrsinnig (Mut ist 'was anderes!).
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg