Formularinhalt in Datein speichern
VivienSchiller
- formulare
- php
0 Julius0 pl0 Gunnar Bittersmann3 Tabellenkalk-2 pl1 Malcolm Beck`s
0 Felix Riesterer
Hallo,
ich habe folgende Situation:
Auf der Startseite meiner Website sollen bis zu drei Nachrichten stehen.
Diese bestehen aus:
Titel
Inhalt
Eventuell verlinkter Seite
Den Inhalt dieser Sachen speichere ich in Textdateien und bevor Diskussionen darüber aufkommen: das werde ich auch auf vielfachen Rat hin nicht ändern. Also alles separat.
Also der Titel der ersten Nachricht steht in "t1.txt", der Inhalt in "c1.txt" und so weiter...
Den Inhalt selbst rufe ich auf der Startseite mit PHP ab und das läuft auch ganz prima.
Mein Problem ist: ich möchte das der Admin im Admin-Bereich den Inhalt ganz entspannt in ein Formular tippt und dieser Inhalt in den Textdateien umgeschrieben wird.
Mir ist bewusst, dass dazu wieder PHP von Nöten ist, aber leider bin ich da auch relativ unbewandert (über den echo-Befehl gehen meine Kenntnisse nicht hinaus) und daher zeige ich euch mal das Formular:
(Davon gibt es logischer Weise drei, für jede Meldung ein eigenes Formular)
<form method="post">
<h5>Erste Meldung</h5>
<p>Titel:</p>
<input value="<?php echo file_get_contents("../bg/prg/data/start/t1.htm") ?>" type="text" name="tit1" />
<p>Inhalt:</p>
<textarea name="con1"><?php echo file_get_contents("../bg/prg/data/start/c1.htm") ?></textarea>
<p>Verlinkte Seite:</p>
<select name="sel1">
<?php echo file_get_contents("adbg/adprg/options.htm") ?>
</select><br/>
<input type="reset" value="Daten löschen" />
<input type="submit" value="Bestätigen" />
</form>
Diese file_get_contents-Sache habe ich eingebaut, damit der Admin auch sieht, was aktuell drin steht. Ich hoffe, dass ihr versteht was ich meine.
Hat jemand einen Lösungsansatz oder idealerweise direkt Code für mich?
Danke schon mal im voraus!
Hallo Vivien,
<?php
file_put_contents('pfad/zur/datei1.txt', $_POST['name_des_formularfelds1']);
file_put_contents('pfad/zur/datei2.txt', $_POST['name_des_formularfelds2']);
?>
sollte das sein, wonach du suchst. Eventuell musst du den Inhalt noch escapen (je nachdem, ob du HTML eingeben willst oder plain-text (escapen nötig)) und dann beim Anzeigen im Editor wieder deescapen. Stichwort htmlspecialchars bzw. htmlspecialchars_decode.
PHP ist keine schwierige Sprache, vielleicht schaust du dir diese Einführung an – es lohnt sich:
http://www.schattenbaum.net/php/
Gruß
Julius
Tach!
[...] sollte das sein, wonach du suchst. Eventuell musst du den Inhalt noch escapen (je nachdem, ob du HTML eingeben willst oder plain-text (escapen nötig)) und dann beim Anzeigen im Editor wieder deescapen. Stichwort htmlspecialchars bzw. htmlspecialchars_decode.
Nicht für das Dateisystem (sprich: die Textdatei) muss maskiert werden, aber beim Einfügen in HTML, und zwar für den Editierzweck und die normale Ausgabe. htmlspecialchars() ist dafür ausreichend.
Soll der Administrator HTML eingeben können, das auch noch ausgeführt werden soll, dann muss die Maskierung nur beim Editiervorgang erfolgen, nicht aber bei der normalen Ausgabe. Außerdem muss dann der Administrator dann selbständig die Einhaltung der Maskierregeln beachten, wenn er seinen Text eingibt.
dedlfix.
Danke Julius!
Das ist genau das was ich suche! Nur zwei Fragen dazu:
Überschreibt der Befehl auch den aktuellen Inhalt, was ich bräuchte?
Wie baue ich das ein?
<?php file_put_contents('pfad/zur/datei1.txt', $_POST['name_des_formularfelds1']); file_put_contents('pfad/zur/datei2.txt', $_POST['name_des_formularfelds2']); ?>
Füge ich das einfach unter das Formular oder gebe ich dem Formular das Attribut
<form method="post" action="write.php">
...
</form>
...und schreibe das file-put_contents dann in dir "write.php"?
Leider verstehe ich ab hier nur noch Bahnhof:
Eventuell musst du den Inhalt noch escapen (je nachdem, ob du HTML eingeben willst oder plain-text (escapen nötig)) und dann beim Anzeigen im Editor wieder deescapen. Stichwort htmlspecialchars bzw. htmlspecialchars_decode.
Also die Abfrage auf der Startseite erfolgt wie folgt:
<h5><?php echo file_get_contents('pfad/zur/datei1.txt'); ?></h5>
<p><?php echo file_get_contents('pfad/zur/datei2.txt'); ?></p>
...
PHP ist keine schwierige Sprache, vielleicht schaust du dir diese Einführung an – es lohnt sich:
http://www.schattenbaum.net/php/
Danke für den Tipp! Ich hab mir vorgenommen, PHP in einer ruhigen Minute mal durchzugehen. Für das aktuelle Projekt habe ich einfach zu spät erkannt, dass PHP sehr hilfreich ist - eigentlich hatte ich schon alles in HTML realisiert, bis mir so Ideen kamen, die dem Admin alles einfacher machen. Ich kenne ihn persönlich und seine Kenntnisse von dem allem sind noch katastrophaler als meine und bevor er mir den Code zerschießt, weil er glaubt, was ändern zu müssen...
Hallo Vivien,
- Überschreibt der Befehl auch den aktuellen Inhalt, was ich bräuchte?
Genau, standardmäßig überschreibt file_put_contents die Dateien, sofern sie bereits existieren. Bei PHP.net stehen zu dieser Funktion noch weitere Infos und Beispiele – ich habe bisher noch nichts entdeckt, dass besser dokumentiert wäre als PHP.
- Wie baue ich das ein?
<?php file_put_contents('pfad/zur/datei1.txt', $_POST['name_des_formularfelds1']); file_put_contents('pfad/zur/datei2.txt', $_POST['name_des_formularfelds2']); ?>
Füge ich das einfach unter das Formular oder gebe ich dem Formular das Attribut
<form method="post" action="write.php"> ... </form>
...und schreibe das file-put_contents dann in dir "write.php"?
Das geht beides. Letzteres ist vielleicht erst einmal übersichtlicher.
Am besten überprüfst du auch noch den Rückgabewert der Funktion:
$text1 = file_put_contents('Datei.txt', $_POST['formularfeldname']);
if($text1 === true)
{
echo 'Daten erfolgreich gespeichert!';
}
else
{
echo 'Hm, das hat nicht geklappt, bitte Speichern wiederholen.';
}
Also die Abfrage auf der Startseite erfolgt wie folgt:
<h5><?php echo htmlspecialchars(file_get_contents('pfad/zur/datei1.txt')); ?></h5> <p><?php echo htmlspecialchars(file_get_contents('pfad/zur/datei2.txt')); ?></p> ...
Ich habe im obigen Zitat einfach mal htmlspecialchars eingefügt.
Wenn du in deinen .txt-Dateien HTML-Code speichern möchtest, müsstest du das (von mir eingefügte) htmlspecialchars weglassen – willst du beispielsweise <em>Text</em> ausgeben, aber nicht Text (HTML soll vom Browser hier nicht interpretiert werden), müsstest du <em>Text</em> in dir txt schreiben, damit das anfangs genannte Ergebnis herauskommt.
Die Frage ist hier, also ob in deinen txt-Dateien HTML-Code oder nur reiner Text „plain text“ stehen soll.
PHP ist keine schwierige Sprache, vielleicht schaust du dir diese Einführung an – es lohnt sich:
http://www.schattenbaum.net/php/Danke für den Tipp! Ich hab mir vorgenommen, PHP in einer ruhigen Minute mal durchzugehen.
Klar, Ruhe und Zeit zum experimentieren braucht man unbedingt!
Gruß
Juliu
Danke Julius erneut!
Ich habe nun folgende Situation:
<form id="elli">
<h5>Erste Meldung</h5>
<p>Titel:</p>
<input value="<?php echo file_get_contents("../bg/prg/data/start/t1.htm") ?>" type="text" name="tit1" />
<p>Inhalt:</p>
<textarea name="con1"><?php echo file_get_contents("../bg/prg/data/start/c1.htm") ?></textarea>
<input type="reset" value="Daten löschen" />
<input type="submit" value="Bestätigen" />
<?php
file_put_contents('t1.htm', $_POST['tit1']);
file_put_contents('c1.htm', $_POST['con1']);
?>
</form>
Allerdings gibt mir das folgenden Fehler aus:
Notice: Undefined index: tit1 in [...]\admin\adbeastart.php on line 30
Notice: Undefined index: con1 in [...]\admin\adbeastart.php on line 31
Zur Info: lines 30 & 31 stehen die php-Befehle file_pu_contents.
Was läuft falsch bzw. wo liegt mein Fehler?
@@VivienSchiller
Was läuft falsch bzw. wo liegt mein Fehler?
Falsch läuft, dass da immer noch nirgends htmlspecialchars()
steht. Und dass die Eingabefelder immer noch unbeschriftet sind.
Dein Fehler liegt darin, dass du nicht zuhörst, was man dir sagt.
LLAP 🖖
@VivienSchiller
Was läuft falsch bzw. wo liegt mein Fehler?
Falsch läuft, dass da immer noch nirgends
htmlspecialchars()
steht. Und dass die Eingabefelder immer noch unbeschriftet sind.
Auch wenn du dies noch nicht im Fokus hast, solltest du das berücksichtigen, zumal der Änderungsaufwand sehr gering ist.
Dein Fehler liegt darin, dass du nicht zuhörst, was man dir sagt.
Zweifelsohne hätte das netter formuliert werden können.
Bis demnächst
Matthias
@@Matthias Apsel
Dein Fehler liegt darin, dass du nicht zuhörst, was man dir sagt.
Zweifelsohne hätte das netter formuliert werden können.
Es ist auch nicht nett von Fragenden, gegebene Antworten komplett zu ignorieren. Zumal sich der Antwortende für Antworten wie diese sicher mehr als 2 Minuten Zeit genommen hat.
Dass ein Antwortender daraufhin besonders nett reagiert, kann man sich wünschen, aber nicht erwarten.
Ich versuche noch mal eine Neuformulierung:
Dein Fehler liegt darin, dass du nicht beachtest, was man dir sagt.
Noch netter geht nicht, denn das träfe nicht den Kern der Sache.
LLAP 🖖
Dein Fehler liegt darin, dass du nicht zuhörst, was man dir sagt.
Zweifelsohne hätte das netter formuliert werden können.
Es ist auch nicht nett von Fragenden, gegebene Antworten komplett zu ignorieren. Zumal sich der Antwortende für Antworten wie diese sicher mehr als 2 Minuten Zeit genommen hat.
Tja, wenn du mir so kommst, dann möchte ich mal darauf hinweisen, dass du meinen Beitrag offensichtlich nicht richtig gelesen hast: ich brauchte eine idiotensichere Erklärung, die mir Julius dankbarer Weise gegeben hat.
Du hast lediglich an meinem Code rummanniert, zumal völlig unnötig.
Dass ein Antwortender daraufhin besonders nett reagiert, kann man sich wünschen, aber nicht erwarten.
Ich versuche noch mal eine Neuformulierung:
Dein Fehler liegt darin, dass du nicht beachtest, was man dir sagt.
Noch netter geht nicht, denn das träfe nicht den Kern der Sache.
Offensichtlich hast du ein generelles Auffassungsproblem, denn
Formuliere höflich und wertschätzend.
steht da nicht als Platzhalter!
Hallo VivienSchiller,
Du hast lediglich an meinem Code rummanniert, zumal völlig unnötig.
Nein. Die dir von Gunnar gegebenen Hinweise solltest du unbedingt beachten.
Bis demnächst
Matthias
@@VivienSchiller
Tja, wenn du mir so kommst, dann möchte ich mal darauf hinweisen, dass du meinen Beitrag offensichtlich nicht richtig gelesen hast: ich brauchte eine idiotensichere Erklärung, die mir Julius dankbarer Weise gegeben hat.
Idioten sind nicht meine Zielgruppe.
Ich schreibe nicht für solche, die Code kopieren wollen ohne ihn zu kapieren und am Ende „funzt“ sagen ohne abschätzen zu können, ob es wirklich funktioniert.
Ich schreibe für alle, die begreifen wollen, was sie tun. „SELFHTML – Die Energie des Verstehens“
Du hast lediglich an meinem Code rummanniert, zumal völlig unnötig.
Gehen wir das Posting nochmal durch:
Ich hatte dir htmlspecialchars()
in der PHP-Doku verlinkt. Und auch weiter unten im Beispielcode gezeigt, wie das anzuwenden ist.
Die Bewertung, ob das „völlig unnötig“ ist oder nicht, überlass bitte besser anderen.
Ich hatte dir fieldset
und label
in der SELFHTML-Doku verlinkt. Anhand des dortigen Beispiels sollte eindeutig ersichtlich sein, wie das anzuwenden ist.
Außerdem schrub ich an dieser Stelle „vielleicht“.
Ich hatte dir anhand von Beispielcode gezeigt, wie label
anzuwenden ist.
Ich hatte dir anhand von Beispielcode gezeigt, wie button
anzuwenden ist.
Welche dieser Erklärungen genau war jetzt nicht „idiotensicher“?
Offensichtlich hast du ein generelles Auffassungsproblem,
Wenn du das sagst …
LLAP 🖖
Hallo,
Welche dieser Erklärungen genau war jetzt nicht „idiotensicher“?
"Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the Universe trying to produce bigger and better idiots. So far, the Universe is winning."
Ich möchte allerdings nicht den Eindruck erwecken, ich wollte Vivien den Idiot-Tag anheften. Ich habe vielmehr den Eindruck, sie war (ist?) so sehr auf ihren Lösungsansatz fixiert, dass sie Alternativen oder Verbesserungsvorschläge gar nicht als solche zur Kenntnis genommen hat, sondern nur als Kritik. Was vielleicht auch an der Art liegt, wie sie geäußert wurden.
So long,
Martin
Ich habe vielmehr den Eindruck, sie war (ist?) so sehr auf ihren Lösungsansatz fixiert, dass sie Alternativen oder Verbesserungsvorschläge gar nicht als solche zur Kenntnis genommen hat, sondern nur als Kritik. Was vielleicht auch an der Art liegt, wie sie geäußert wurden.
Danke, Martin! Ich fühle mich verstanden. Zugegebener Maßen bin ich nicht sehr offen für Alternativen, auch wenn sie aus eurer Sicht einfacher sind. Ihr habt sie einmal verstanden und für euch ist das alles total einfach. Für allerdings bedeutet das einen Lernaufwand, für den ich Zeit bräuchte, die ich nicht habe.
Grüße!
Lieber VivienSchiller,
bedeutet das einen Lernaufwand, für den ich Zeit bräuchte, die ich nicht habe.
man könnte Dir hier einiges an Zeit einsparen helfen. Dabei müsstest Du nur offen und bereit dafür sein.
Liebe Grüße,
Felix Riesterer.
man könnte Dir hier einiges an Zeit einsparen helfen. Dabei müsstest Du nur offen und bereit dafür sein.
Okay, mein Problem ist jetzt einfach, dass ich keine der angebotenen Alternativen verstehe.
Liebe VivienSchiller,
Okay, mein Problem ist jetzt einfach, dass ich keine der angebotenen Alternativen verstehe.
ich hatte Dir schon angeboten, dass Du nur zu sagen bräuchtest, wie Du auf einer ganz bestimmten Seite ganz bestimmte Inhalte aus Deinen Textdateien aussuchst, damit man Dir die Entsprechung in JSON zeigen kann. Wenn das bekannt wäre, könnte man Dir ganz konkrete Starthilfe geben.
Liebe Grüße,
Felix Riesterer.
Hallo Felix,
dass Du nur zu sagen bräuchtest, wie Du auf einer ganz bestimmten Seite ganz bestimmte Inhalte aus Deinen Textdateien aussuchst, damit man Dir die Entsprechung in JSON zeigen kann. Wenn das bekannt wäre, könnte man Dir ganz konkrete Starthilfe geben.
Welche Informationen brauchst du um es mir zu erklären?
Grüße!
Liebe VivienSchiller,
dass Du nur zu sagen bräuchtest, wie Du auf einer ganz bestimmten Seite ganz bestimmte Inhalte aus Deinen Textdateien aussuchst, damit man Dir die Entsprechung in JSON zeigen kann. Wenn das bekannt wäre, könnte man Dir ganz konkrete Starthilfe geben.
Welche Informationen brauchst du um es mir zu erklären?
ein Code-Beispiel oder alternativ einen Link zu einer Beispielseite, damit erkennbar wird, welche Inhalte aus der Datendatei kommen, und welche sozusagen zum "Gerüst" der Seite gehören. Außerdem wäre interessant zu wissen, ob Du die Inhalte je nach "Datei" in der Adresse, oder je nach URL-Parametern (wie z.B. http://example.org/index.php?seite=1234&a=irgendwas&b=anderes
) auswählst.
Stellen wir uns eimal vor, Du speichertest tatsächlich diverse Daten in einer JSON-Datei (z.B. namens inhalte.json
):
{
"hasenjagd": {
"title": "Hasenjagd",
"heading": "Halali! Auf zur Hasenjagd",
"content": "Bei der diesjährigen Hasenjagd ging es auch dieses Mal wieder den Langohren gehörig an den Kragen. Immerhin verwendeten die Jäger als Lockmittel Bio-Möhren."
},
"streichelzoo": {
"title": "Streichelzoo",
"heading": "Neuer Streichelzoo im Park eröffnet",
"content": "Die Saison zum \"Tierekuscheln\" hat wieder begonnen. Zu diesem Zweck hat die Stadt im Park einen Streichelzoo für Groß und Klein eingerichtet. Der Eintritt ist eine kleine Tüte Tiertrockenfutter."
}
}
In Deinem PHP-Script kannst Du diese Datei in ein Array hineinlesen lassen:
function getJsonData () {
$data = array();
$json = file_get_contents('./inhalte.json');
$test = json_decode($json, true); // true für assoziatives Array
if ($test !== null) {
$data = $test;
}
return $data;
}
In obiger Funktion wird als zurückzugebender Inhalt ein leeres Array definiert, falls unsere JSON-Daten aus irgendeinem Grund (z.B. Syntaxfehler in der JSON-Datei) nicht gelesen werden können - oder wenn keine da sind. Anschließend wird der Dateiinhalt in die Variable $json
eingelesen. Dieser Inhalt wird dann mit der Funktion json_decode
(deutsche Erklärung) in eine Datenstruktur umgewandelt, die mit dem zweiten Parameter (der Wert true
) als ein Array definiert wird.
Sollte die Funktion json_decode
auf Probleme stoßen, so gibt sie den Wert null
zurück. Wenn dies nicht der Fall ist, wird das Ergebnis zu unserem Rückgabewert.
Wenn Du nun ein Script hast, das versucht, Inhalte in eine Seite einzubauen, dann könnten die Daten folgendermaßen genutzt werden:
$gefordert = 'hasenjagd'; // Beispielwert, abhängig von der auszuliefernden Seite
$inhalte = getJsonData(); // liefert garantiert ein Array
if (array_key_exists($gefordert, $inhalte)) {
// Titel benutzen
$titel = $inhalte[$gefordert]['title'];
// Überschrift benutzen
$ueberschrift = $inhalte[$gefordert]['heading'];
// Inhalt benutzen
$text = $inhalte[$gefordert]['content'];
}
Wenn nun auf der Seite die Inhalte zu "hasenjagd" angezeigt werden sollen, so versucht obiger Code, ob es zu exakt diesem Wert (also Hasenjagd in Kleinbuchstaben) einen Eintrag gibt. Die JSON-Datei oben hat einen solchen Eintrag. Also kann unser Script passende Inhalte finden. Das liegt daran, dass unser Array einen passenden Schlüssel (so nennt man das bei Arrays) hat. Das könnte man auch als $inhalte['hasenjagd']
notieren, hätte dann aber keine Möglichkeit, andere Seiten mit dem selben Code zu bedienen. Daher notiert man den Schlüssel als Variable in den eckigen Klammern: $inhalte[$gefordert]
.
Zu diesem Schlüssel gibt es als Wert wiederum ein Array (denke "Schachtel in einer Schachtel"), welches die drei Schlüssel "title", "heading" und "content" hat, also genau die Schlüsselnamen, die in der JSON-Datei durch ihre Struktur vorgegeben sind (Du darfst andere Schlüsselnamen benutzen, jedoch sind englische Bezeichner inzwischen ein sinnvoller Standard - Hauptsache Dein PHP-Code benutzt identische Schlüsselnamen wie die JSON-Datei!). Entsprechend kann man dann mit einem weiteren Paar an eckigen Klammern die Schlüssel des inneren Arrays notieren, wie z.B. den Titel: $inhalte[$gefordert]['title']
.
Was Du im Einzelfall mit den Daten tatsächlich anstellst, kann ich nicht wissen, da ich Deinen PHP-Code nicht kenne. Wie Du mit Arrays in PHP umgehen kannst, steht im PHP-Manual (sogar auf deutsch).
Hoffentlich kommst Du nun etwas besser zurecht. Wenn Du weitere Denkanstöße brauchst, melde Dich doch wieder!
Liebe Grüße,
Felix Riesterer.
@@Felix Riesterer
"content": "Die Saison zum \"Tierekuscheln\" hat wieder begonnen …"
Da sollte
"content": "Die Saison zum „Tierekuscheln“ hat wieder begonnen …"
stehen. Dann muss auch nichts escapet werden.
LLAP 🖖
Hallo,
Da sollte ... stehen
zwischen „sollte“ und „wird“ ist aber ein nicht zu vernachlässigender Unterschied!
Gruß
Kalk
Hallo Vivien,
ich habe deinen Code ein wenig geändert:
<form id="elli" method="post">
<h5>Erste Meldung</h5>
<p><label for="tit1">Titel:</label></p>
<input value="<?php echo htmlspecialchars(file_get_contents("../bg/prg/data/start/t1.htm")); ?>" type="text" name="tit1" id="tit1" />
<p><label for="con1">Inhalt:</label></p>
<textarea name="con1" id="con1"><?php echo htmlspecialchars(file_get_contents("../bg/prg/data/start/c1.htm")); ?></textarea>
<button type="submit">Absenden</button>
<?php
if(isset($_POST['tit1']))
{
file_put_contents('t1.htm', $_POST['tit1']);
}
if(isset($_POST['con1']))
{
file_put_contents('c1.htm', $_POST['con1']);
}
?>
</form>
Allerdings gibt mir das folgenden Fehler aus:
Notice: Undefined index: tit1 in [...]\admin\adbeastart.php on line 30
Notice: Undefined index: con1 in [...]\admin\adbeastart.php on line 31
Zur Info: lines 30 & 31 stehen die php-Befehle file_pu_contents.
Was läuft falsch bzw. wo liegt mein Fehler?
Die Indizes existieren nicht. Ich habe mal folgendes ergänzt:
Gruß
Julius
Idee:
<!-- title=Extensible Markup Language Remote Procedure Call ist mehr als XML-RPC -->
<!-- descr=XMLRPC, SOAP und Rest sind wichtige Werkzeuge zum Content Management meines Framework -->
<!-- parent=/framework -->
<!-- no_cache=1 -->
<p>Ein wichtiges Werkzeug zum administrative Management in meinem Framework ist der <code>Remote Procedure Call</code>. Das hört sich kompliziert an, ist es aber nicht, denn die Sache an sich ist eine sehr einfache <code>Client/Server-Anwendung</code> und die Übertragung erfolgt per <code>HTTP</code>.</p>
...
Das lässt sich hervorragend parsen ind die Einzelteile.
@@VivienSchiller
Auf der Startseite meiner Website sollen bis zu drei Nachrichten stehen.
Diese bestehen aus:
- Titel
- Inhalt
- Eventuell verlinkter Seite
Den Inhalt dieser Sachen speichere ich in Textdateien und bevor Diskussionen darüber aufkommen: das werde ich auch auf vielfachen Rat hin nicht ändern. Also alles separat.
Darüber würde ich aber doch nochmal nachdenken. Du musst kein Datenbanksystem einsetzen; aber warum nicht alles in eine Textdatei? Die könnte so aussehen:
[
{
title: "Titel der 1. Nachricht",
content: "Inhalt der 1. Nachricht",
url: "http://example.net/foo"
},
{
title: "Titel der 2. Nachricht",
content: "Inhalt der 2. Nachricht"
},
{
title: "Titel der 3. Nachricht",
content: "Inhalt der 3. Nachricht",
url: "http://example.net/bar"
}
]
JSON ist das gängige Format für strukturierte Daten. Das lässt sich einfach erzeugen und verarbeiten.
Mir ist bewusst, dass dazu wieder PHP von Nöten ist, aber leider bin ich da auch relativ unbewandert (über den echo-Befehl gehen meine Kenntnisse nicht hinaus)
Da wird’s gefährlich. Du der Kenntnis zu echo
gehört unbedingt die Kenntnis zu htmlspecialchars()
.
Du darfst niemals Daten, die Schadcode einschleusen könnten, unbehandelt mit PHP in HTML-Quelltext schreiben.
und daher zeige ich euch mal das Formular:
(Davon gibt es logischer Weise drei, für jede Meldung ein eigenes Formular)
Auch darüber könnte nochmal nachgedacht werden. So logisch erscheint mir das nicht unbedingt.
However:
<h5>Erste Meldung</h5>
Überschriften 5. Ordnung sind ungewöhnlich. Hast du denn h1
bis h4
(ohne Lücke) auf der Seite? h1
, h2
usw. müssen nacheinander entsprechend der Hierarchie verwendet werden, nicht nach der gerade gewünschten Schriftgröße. Diese ist Sache von CSS.
Vielleich sollte das aber auch gar keine Überschrift sein, sondern legend
eines fieldset
s?
<p>Titel:</p>
<input value="<?php echo file_get_contents("../bg/prg/data/start/t1.htm") ?>" type="text" name="tit1" />
Alle Eingabefelder sollten eine Beschriftung haben. Dieses hat keine. Alle anderen auch nicht.
So hat es eine:
<p><label for="tit1">Titel:</label></p>
<input value="<?php echo htmlspecialchars(file_get_contents("../bg/prg/data/start/t1.htm")); ?>" type="text" name="tit1" id="tit1"/>
Bei den anderen Eingabefeldern entsprechend. htmlspecialchars()
hab ich mit eingebaut.
<input type="reset" value="Daten löschen" />
Der Sinn eines Reset-Buttons ist zweifelhaft; die könnten eher Verwirrung stiften als Nutzen bringen.
Für Buttons gibt es in HTML das button
-Element, welches vorzugsweise verwendet werden sollte:
<button type="reset">Daten löschen</button>
<input type="submit" value="Bestätigen" />
<button type="submit">Bestätigen</button>
(Wobei type="submit"
für Buttons in Formularen Default ist, also weggelassen werden kann.
LLAP 🖖
Hallo,
Du darfst niemals Daten, die Schadcode einschleusen könnten, unbehandelt mit PHP in HTML-Quelltext schreiben.
Warum so einschränkend? Und wie willst du die Daten unterscheiden? Hast du ein Kriterium, wann Daten Schadcode einschleusen können und wann nicht?
Es ist die Begründung: Du darfst niemals Daten unbehandelt mit PHP in HTML-Quelltext schreiben, weil sie Schadcode enthalten könnten!
Gruß
Kalk
@@Tabellenkalk
Du darfst niemals Daten, die Schadcode einschleusen könnten, unbehandelt mit PHP in HTML-Quelltext schreiben.
Warum so einschränkend? Und wie willst du die Daten unterscheiden? Hast du ein Kriterium, wann Daten Schadcode einschleusen können und wann nicht?
Ja.
$antwort = 42;
<p>Die Antwort ist <?= $antwort ?>.</p>
Hier ist kein htmlspecialchars()
erforderlich.
Daten, die im Script selbst berechnet werden (und keine Strings sind), können keinen Schadcode einschleusen.
LLAP 🖖
Tach,
Daten, die im Script selbst berechnet werden (und keine Strings sind), können keinen Schadcode einschleusen.
das widerspricht allerdings dem Standpunkt von Security by Design, weil bei allen späteren Änderungen am Code überprüft werden muss, ob diese Annahme auch jetzt noch gilt.
mfg
Woodfighter
@@woodfighter
Daten, die im Script selbst berechnet werden (und keine Strings sind), können keinen Schadcode einschleusen.
das widerspricht allerdings dem Standpunkt von Security by Design, weil bei allen späteren Änderungen am Code überprüft werden muss, ob diese Annahme auch jetzt noch gilt.
Das hieße, dass man echo
immer mit htmlspecialchars()
verwenden sollte, nie ohne.
Also dass es echo
als solches gar nicht geben sollte.
Also nie echo
verwenden, sondern stets printSanitized()
function printSanitized($output)
{
print htmlspecialchars($output);
}
Richtig?
LLAP 🖖
Tach,
das widerspricht allerdings dem Standpunkt von Security by Design, weil bei allen späteren Änderungen am Code überprüft werden muss, ob diese Annahme auch jetzt noch gilt. Das hieße, dass man
echo
immer mithtmlspecialchars()
verwenden sollte, nie ohne.Also dass es
echo
als solches gar nicht geben sollte.
nein, schließlich gibt man mit PHP nicht ausschließlich (HTML-)Quellcode aus, der wieder interpretiert wird.
Also nie
echo
verwenden, sondern stetsprintSanitized()
function printSanitized($output) { print htmlspecialchars($output); }
Richtig?
Das würde funktionieren (allerdings nur für HTML, das sollte der Funktionsname dann auch wiederspiegeln), für eine gemischte Ausgabe wäre eine Template-Engine eh zu empfehlen (bevorzugt eine, die mir auch gleich das Escaping abnimmt).
mfg
Woodfighter
Tach!
Das hieße, dass man
echo
immer mithtmlspecialchars()
verwenden sollte, nie ohne.
Nein. Faustregeln, die einem das Denken abnehmen sollen, sollte man nie verwenden.
Wann immer programmiert und geändert wird, sollte man sich der Konsequenzen bewusst sein oder sie sich bewusst machen. Einmalig eine Absicherung einzubauen, die allen künftigen Situationen gerecht werden soll, ist ein sehr trügerisches Ruhekissen.
dedlfix.
Grundlage für Zitat #2087.
@@dedlfix
Das hieße, dass man
echo
immer mithtmlspecialchars()
verwenden sollte, nie ohne.Nein. Faustregeln, die einem das Denken abnehmen sollen, sollte man nie verwenden.
Das ist mal ’ne gute Faustregel! ;-)
Wann immer programmiert und geändert wird, sollte man sich der Konsequenzen bewusst sein oder sie sich bewusst machen. Einmalig eine Absicherung einzubauen, die allen künftigen Situationen gerecht werden soll, ist ein sehr trügerisches Ruhekissen.
Darauf wollte ich hinaus. Auch wenn ich meine Fragen mit einem Punkt beendet habe.
LLAP 🖖
Moin!
Das hieße, dass man echo immer mit htmlspecialchars() verwenden sollte, nie ohne.
Nicht immer:
echo intval ($foo * $bar), " Ocken";
printf("%u Fliegen haben recht!...", $oneBillion);
function printSanitized($output) { print htmlspecialchars($output); }
Richtig?
Ich vermute mal Du wolltest so eine Antwort provozieren:
Nein. Es gibt keinerlei Vorteil sich hierfür quasi eine Kopie der nativen Funktion zu machen, die dann - anders als das Original - nicht mal im Name erkennen lässt, was diese tut. Der Sicherheitsgewinn ist also sogar negativ.
Jörg Reinholz
JSON ist das gängige Format für strukturierte Daten. Das lässt sich einfach erzeugen und verarbeiten.
Die Datenstruktur hat mit der Sequenz überhaupt nichts zu tun, auch dann nicht wenn der Serializer JSON heißt. Im Grund genommen kannst Du zum Speichern in Dateien jeden beliebigen Serializer verwenden, wie die Sequenz am Ende aussieht ist völlig wurst.
@@pl
JSON ist das gängige Format für strukturierte Daten. Das lässt sich einfach erzeugen und verarbeiten.
Die Datenstruktur hat mit der Sequenz überhaupt nichts zu tun, auch dann nicht wenn der Serializer JSON heißt. Im Grund genommen kannst Du zum Speichern in Dateien jeden beliebigen Serializer verwenden, wie die Sequenz am Ende aussieht ist völlig wurst.
Ich hätte zu Deiner Anwort noch eine kurze, aber immens wichtige Rückfrage: Häh??
LLAP 🖖
PS: Quelle: Cheatah
Hi Gunnar
So hat es eine:
<p><label for="tit1">Titel:</label></p> <input value="<?php echo htmlspecialchars(file_get_contents("../bg/prg/data/start/t1.htm")); ?>" type="text" name="tit1" id="tit1"/>
Beschriftet man so neuerdings Formulare? Meine Güte, wie lange war ich denn nicht mehr Aktiv?
Bis bald
@@Malcolm Beck`s
<p><label for="tit1">Titel:</label></p> <input value="<?php echo htmlspecialchars(file_get_contents("../bg/prg/data/start/t1.htm")); ?>" type="text" name="tit1" id="tit1"/>
Beschriftet man so neuerdings Formulare?
Antwort von Radio Jerewan: Im Prinzip ja.
Nur nicht Formulare, sondern Eingabefelder.
Und nicht neuerdings, sondern schon ewig.
LLAP 🖖
Hi Gunnar,
<p><label for="tit1">Titel:</label></p> <input value="<?php echo htmlspecialchars(file_get_contents("../bg/prg/data/start/t1.htm")); ?>" type="text" name="tit1" id="tit1"/>
Nur nicht Formulare, sondern Eingabefelder.
Also wenn die Eingabefelder ausserhalb eines Formulares sind?
Und nicht neuerdings, sondern schon ewig.
Sehe ich in dieser Form zum ersten mal. Wenn das input-Element wenigstens noch innerhalb des p-Elementes wäre, ok, aber so? Ist mir neu ;)
Bis bald
Hallo
<p><label for="tit1">Titel:</label></p> <input value="<?php echo htmlspecialchars(file_get_contents("../bg/prg/data/start/t1.htm")); ?>" type="text" name="tit1" id="tit1"/>
Nur nicht Formulare, sondern Eingabefelder.
Also wenn die Eingabefelder ausserhalb eines Formulares sind?
Nein, auch wenn sie innerhalb eines Formulars sind. Es dient ja dazu, die Beschriftung an sein Eingabeelement zu knüpfen, egal, ob innerhalb oder außerhalb eines Formulars. Dass man so die Bedienung mMn wesentlich verbessert, ist der andere Punkt. Magst du Buttons und Texteingabefelder mit der Maus oder dem Finger gut treffen, bei Radiobuttons oder Checkboxen kann das schnell zum Gefummel werden. Über einen Treffer der Beschriftung das Feld selbst ein-, aus- oder umzuschalten, ist da wesentlich bequemer.
Zudem ist es in den Betriebssystemenm, also bei nativen Programmen im Normalfall [1] Standard und diesen Standard sollte man als HTML-Autor dem Benutzer auch anbieten.
Und nicht neuerdings, sondern schon ewig.
Sehe ich in dieser Form zum ersten mal.
Das gibt es schon mindestens seit HTML4. Es wird aber von den meisten HTML-Autoren standhaft ignoriert.
Wenn das input-Element wenigstens noch innerhalb des p-Elementes wäre, ok, aber so? Ist mir neu ;)
Das Input sollte mMn schon mit dem Label gruppiert sein, aber über die Attribute for
und id
finden sich die Elemente auch, wenn sie ansonsten un- oder nicht miteinander gruppiert sind.
Tschö, Auge
Also dann, wenn es der (UI)-Programmierer nicht versaut hat. ↩︎
Hi Auge,
<p><label for="tit1">Titel:</label></p> <input value="<?php echo htmlspecialchars(file_get_contents("../bg/prg/data/start/t1.htm")); ?>" type="text" name="tit1" id="tit1"/>
Das Input sollte mMn schon mit dem Label gruppiert sein
Das finde ich auch am sinnvollsten.
aber über die Attribute
for
undid
finden sich die Elemente auch, wenn sie ansonsten un- oder nicht miteinander gruppiert sind.
Es ist doch viel einfacher, das input-Element ins label zu packen. Da kann man sich sowohl das p-Element, als auch for
und id
sparen. Allein schon um mir das for zu sparen, packe ich input
immer in ein label
.
Bis bald
Hallo Malcolm Beck`s,
Es ist doch viel einfacher, das input-Element ins label zu packen. Da kann man sich sowohl das p-Element, als auch
for
undid
sparen. Allein schon um mir das for zu sparen, packe ichinput
immer in einlabel
.
Es war lange keine gute Idee, sich das for-Attribut zu sparen. Siehe etwa Jan Erics Kommentar sowie http://www.barrierefreies-webdesign.de/knowhow/formulare/label.html. Inzwischen können die Screenreader damit um (Forum)
Bis demnächst
Matthias
Liebe VivienSchiller,
und bevor Diskussionen darüber aufkommen: das werde ich auch auf vielfachen Rat hin nicht ändern.
warum?
Liebe Grüße,
Felix Riesterer.
Hallo Felix,
und bevor Diskussionen darüber aufkommen: das werde ich auch auf vielfachen Rat hin nicht ändern.
warum?
Weil die Alternativen zu komplex sind. Datenbanken stehen mir nicht zur Verfügung und es würde zu lange dauern mich mit neuen Dateiformaten zu befassen, denn wie bereits gesagt:
Für das aktuelle Projekt habe ich einfach zu spät erkannt, dass PHP sehr hilfreich ist - eigentlich hatte ich schon alles in HTML realisiert, bis mir so Ideen kamen, die dem Admin alles einfacher machen. Ich kenne ihn persönlich und seine Kenntnisse von dem allem sind noch katastrophaler als meine und bevor er mir den Code zerschießt, weil er glaubt, was ändern zu müssen...
Es sei denn, du könntest mir simple Alternativen nennen, die ich noch nicht kenne. Dafür wäre ich auch äußerst dankbar.
Grüße!
Liebe VivienSchiller,
@Gunnar Bittersmann hat Dir doch schon eine sehr bequeme Alternative genannt! Das JSON-Dateiformat ist eine simple Textdatei, die von Menschen sehr gut gelesen und verstanden werden kann. Außerdem kann man alle Informationen in einer einzigen Datei ablegen, anstatt alles in vielen kleinen Dateien zu verstreuen.
Um mit JSON erfolgreich umgehen zu können, bietet PHP passende Funktionen an, die die Information aus der Datei einlesen und in der von Dir gewünschten Datenstruktur (Array oder Object) in eine Variable schreiben kann. Du bräuchtest also nur zu sagen, wie Du auf einer ganz bestimmten Seite ganz bestimmte Inhalte aus Deinen Textdateien aussuchst, damit man Dir die Entsprechung in JSON zeigen kann.
Liebe Grüße,
Felix Riesterer.