Alle PHP Variable nach REFRESH/RELOAD weg, selbst nach Speicherung in extener Datei, warum?
Nachdem ja bald Weihnachten ist und die Homepage bis dahin fertig hätte sein sollen, was ich mittlerweile so gut wie aufgegeben habe, stelle ich hiermit zum dritten Mal die selbe bzw. ähnliche FRAGE! Und vielleicht haben wir ja hier bald ein Weihnachtswunder und jemand versteht endlich was das Problem ist, das scheinbar nur ich habe!
Also gut ich probiers nocheinmal zu erklären! Ich habe eine Online Bearbeitungsseite (und ich brauche keine Tipps, dass das ungeeignet oder sonst was ist!, ich möchte einfach meine Frage beantwortet haben) und hier habe ich ein Formular, so weit so gut! Bei diesem Formular kann man z.B. den Titel eines Bildes eingeben in ein Input Field! Was soll das ganze Bezwecken? Es hätte dann ursprünglich durch den Input ausgegeben werden sollen (sowohl auf der Bearbeitungsseite) - als auch auf der Besucherseite.. Diese Vorstellung ist ja dann immer unlogischer geworden, wie man hier einsehen kann, wo mir leider noch niemand beantworten konnte was ich machen muss https://www.gutefrage.net/frage/text-auf-seite-behalten-nach-absendung-wie?foundIn=notification-center#answer-232225061 .... soweit so gut, dann habe ich mir gedacht gut, wenn das alles nicht funktionieren will schaust du dir ein Tutorial an, wo der Input in einer Datei gespeichert wird funktioniert auch wieder alles super (wird in Datei angezeigt und sogar ausgegeben) - wäre da nicht schon wieder wie vorher dieses echt penetrant nervige Reload Problem. Nach dem Reload wird nämlich sofort alles aus der externen Datei herausgelöscht und die Variable ist wieder undefined (ich kann's nicht mehr lesen)
PS:
$var1 = $_POST['firstName']; (secondName..... usw.)
$fileHandle = fopen("myDataFile", 'w'); fwrite($fileHandle, $var1); fwrite($fileHandle, $var2); fclose($fileHandle);
echo $var1; (habs auch wie im Tutorial probiert einmal mit read zusammenzufassen und auszugeben)
Sollte mich jemand auf einen Fehler hinweisen, danke sehr nett den hat's aber im Quellcode nie gegeben, da es schlicht und ergreifend funktioniert! Nur wie gesagt egal was ich probiere und ich bin mittlerweile echt schon leicht bis mittelschwer am Tiefpunkt der Verzweiflung löscht sich alles! und ich meine alles! Nach dem Reload bzw. Nach der erneuten Bestätigung des Links per Enter... SUPER (Vielleicht kann mir endlich jemand eine Lösung liefern und somit mir eine Riesenfreude machen, mittlerweile glabu ich ja nicht mehr dran)
6 Antworten
Prüf ob post submit gesetzt und deine datenvariable überhaupt daten hat. Nur dann soll die textdatei beschrieben werden. Du kannst froh sein das das überhaupt funktioniert, manche programmsprachen hätten nicht akteptiert das du versuchst nen undefiniertes objekt mit wert null in nen stream zu packen und das in ne datei schreiben zu lassen. Und äh ganz ehrlich warum unbedingt mit textdatei? Wenns was Größeres werden soll oder komplexeres wirst du damit nicht weit kommen
also gut, auch wenn ich dein problem nicht ganz verstanden habe versuche ich es mal:
1.) wenn du ein formular abschickst, wirst du auf eine neue seite geleitet, das ist das klassische formularverhalten. kann mit dem "iframetrick" "umgangen werden, bleibt aber unschön!
2.)a: wenn du irgendetwas dauerhaft speichern möchtest, sollte man es in eine datenbank schreiben!,
b: wenn du etwas nur temporär speichern möchtest (solange der user auf der seite ist), dann reicht es das ganze in eine (globale) javascriptvariablen zu speichern.
c: du kannst auch etwas in cookies schreiben und diese beim laden der seite einlesen, dann kannst du für einen bestimmten user etwas länger und ohne db speichern. (der user kann es aber löschen, bzw. cookies deaktiviert haben)
2a.) wenn du es in eine datenbank schreiben willst, solltest du am besten gar kein formular verwenden, sondern einfach einen button hinzufügen und diesen via javascript/jquery ansprechen und dann einen ajax-request an den server schicken ("deine php seite") und dort die von javascript übergebenen daten ganz normal in variablen schreiben, und dann kannst du die in deine sql-datenbank schreiben. auch kannst du dann die ajax-anfrage mit einer rückgabe beantworten, die du dann in deinem javascript-code wieder weiterverarbeitest und "nachträglich" in die seite einpflegst, sodass diese nicht komplett neu geladen wird.
2b.) wenn du deine informationen nur in javascript speicherst, kannst du im prinzip deine gesamte programmlogik in javascript schreiben und brauchst php nur noch bedingt. -> wenn du etwas vom server willst, solltest du es auch hier per ajax-aufruf machen.
was passiert denn auf der website wenn man ein bild hochlädt?, also was ist der ablauf und was bekommt man am ende?
wenn ich das verstehe kann ich dir vielleicht eine gute lösung vorschlagen.
1.) bild hochladen
2.) bildtitel vergeben
.....
????
Ja ich lade per Klick eben ein Bild hoch, das wird dann in Bild1.jpg unbenannt. Überall wo man nun <a href="Bild1.jpg"> eingegeben hat erscheint das Bild auf der Webseite. Das bringt aber leider in dem Fall nichts... und wenn ich nur wüsste wie man mit Datenbanken anfangen soll, offline gebe ich localhost:phpmysql ein und verbinde die dann im PhP Code aber wo ich im Endeffekt online eine Datenbank bekomme bzw. einbinde weiß ich leider nicht. Und wie gesagt Berechtigungen habe ich leider nicht so wie es sein sollte (also keinen vollen Zugriff auf den Webhost, kann nur FTP leider)
1.) frag mal nach dem login für den webhoster -> mysql & phpmyadmin zum erstellen und verwalten von datenbanken
2.) wenn das nichts wird schau dir mal das thema sqlite an.
3.) ansonsten könntest du die bilder wie gehabt hochladen, allerdings umbenennen in "Das_ist_mein_Bildtitel.counter.jpg" und mit php das verzeichnis der bilder einlesen und für jeden eintrag z.b.
echo '<img src="'.$pfadzumbild.$eintrag.'">';
ausgeben lassen.
um den bildtitel richtig anzugeben kannst du $eintrag an den punkten splitten und die "_" durch " " ersetzen. und dann in eine html form bringen. (der counter nach dem ersten punkt beugt lediglich doppelten bildbennenungen vor, und kann bei der textausgabe daher fallen gelassen werden)
hierbei sind allerdings nicht alle zeichen möglich.
4.) für eine website sollte man cms benutzen. in fast jedem cms gibt es von anderen bereist programmierte module, die man auf seine bedürfnise anpassen kann. damit wäre es um ein vielfaches leichter und auch sauberer. außerdem musst du wenn du inhaltlich an der website etwas änderst nicht immer im nackten code rumeditieren!
zum abschluss: für dein nächstes projekt solltest du dich erstmal mit einem cms deiner wahl befassen (ich bevorzuge modx, aber auch joomla, wordpress, etc. haben ihre besonderheiten)
dann solltest du dich mit den vorgefertigten modulen deines cms befassen und der api/docu.
wenn du dann ein wenig damit rumgespielt hast, empfiehlt es sich das thema sql anzuschauen. ich finde immernoch, dass das erstellen eines gästebuchs dafür ein guter anfang ist.
wenn du auch das gemeistert hast kannst du dich mit dem thema javascript/jquery befassen und erstmal nur "effekte" erstellen. wenn du mit sprache halbwegs vertraut bist, kannst du dich an das ajax prinzip heranwagen und z.b. versuchen einen (gruppen)chat zu schreiben. dafür musst du dir aber noch ein geignetes datenbankschema überlegen, das auf deine vorstellungen abgestimmt ist.
parallel zu allem kannst du dich mit design befassen. ein zeitgemäßer start wäre die verwendung von bootstrap und die farbpaletten des google material design. aber auch hier ist es letzlich jedem selbst überlassen. man muss nur kreativ genug sein.
p.s. ein weiteres wichtiges thema sollte svg sein, da vektorgrafiken in der modernen webentwicklung immer mehr anklang finden. hierbei geht bei der skalierung keine qualität verloren, da die bilder in form von vektoren vorliegen. das sollte man z.b. bei logos, icons, etc. benutzen. (inkscape, kostenlos)
Ja genau so stelle ich mir eine Antwort vor, und nicht so wie gewisse andere Leute, die mich einfach nur bemängeln und schlecht reden ohne einen Ansatz, der zur Besserung beiträgt.
Das Problem war bisher immer ich hab z.B. was praktisches wie Funktionen, Schleifen, zufällige Zahlen Ausgabe von Büchern gelernt (DOM z.B. erst mit Jquery ein wenig verstanden) und muss ehrlich zugeben das meiste wieder vergessen. Was mich dran schockiert ist ja, dass ich eigentlich nicht dumm bin, ohne mich selbst zu loben, aber hier hat mir bis jetzt leider komplett der Ansatz gefehlt. Was bringt es wenn ich Schleifen schreiben kann, aber in Wirklichkeit überhaupt nicht verstehe für was ich das im Endeffektt auch dann brauche, weißt du wie ich meine?...
PHP hab ich eigentlich nicht angefangen in einem Buch zu lernen, sondern habe es von Tutorials, finde ich persönlich aber sogar noch logischer und Anwendungsgetreuer als JS "vanilla" sag ich jetzt mal :).
Gut, dass mit dem Bild verstehe ich leider nicht wirklich, und das ist auch so ein wenig das Problem bin dahingehend leider nicht der talentierteste, vorallem weil ich eben nicht verstehe was du mit Eintrag meinst, wenn's nicht macht würd ich das einfach so lassen und wirklich das Projekt irgendwie beenden und anfangen mit CMS herumzueiern..
Ehm, was ich mir bei CMS jedoch von Anfang an gedacht habe war, das ist doch unprofesionnel oder etwa nicht? Oder können die meisten trotz der Verwendung eines CMS genauso wie ich HTML Codes und CSS Seiten schreiben, wollen es aber nicht, da es in Wirklichkeit viel unprofessioneller ist? Was ich auf keinen Fall will ist irgendwelche Bilder da hinziehen, wo ich sie haben will, das wäre dann schon wenig "jimdo" mäßig und wäre sogar für meine mageren Kenntnisse eine Beleidigung jeder Anstrengung, die ich reingesteckt habe.
Also danke nochmal für deine Antwort und viele Grüße :)
bezüglich cms kann ich dir leiden keinen großen überblick mehr geben, da ich mitlerweile bis auf ein projekt alles auf modx umgezogen habe.
modx ist folgendermaßen aufgebaut:
du hast links ein seitenmenü mit 3 reitern. der erste sind deine eigentlichen seiten der website (auch unterseiten möglich in orndnerstruktur) -> hier ist im prinzip nur die struktur und der reine inhalt jeder seite
der zweite reiter ist für templates (deine designvorlagen/html grundgerüst was gleich bleibt), diese kannst du einzelnen seiten der website zuweisen, musst aber nicht jeder unterseite das gleiche template geben.
dann sind hier noch sogenannte tvs (template variablen) in denen du einzelne variablen wie zum beipiel ein logo speichern kannst. diese tv kannst du dann in deinem template als tag einbinden z.b. [[*logo]]
und musst wenn sich jetzt an dem logo was ändert nicht dein template bearbeiten, sondern nur die variable. (tvs können auch mit parametern aufgerufen werden)
dann gibt es noch chunks, das sind praktisch html schnipsel/gerüste, die du beim aufrufen mit paramtern füllen kannst. z.b. kannst du ein kontaktformular als chunk speichern und in deiner html seite diesen chunk einfach mit [[$kontaktformular]] aufrufen.
dann gibt es noch snippets, das sind php-code blöcke, und auch diese können mit parametern aufgerufen werden.
chunks, snippets und tvs können sich auch gegenseitig aufrufen, was es einem ermöglicht im prinzip verdammt viel komplett dynamisch erzeugen zu lassen. bei snippets kannst du zusätzlich sagen, ob diese ungecached aufgerufen werden müssen oder ob mit dem cache gearbeitet werden darf bis zur nächsten änderung...
die aufrufe können auch verschachtelt stattfinden
z.b.: [[!sendMail? &empfaenger=`[[!getLeader? &isadmin=`true`]]´ &sender=`[[$standardmail]]`]]
//man müsste halt die nötigen chunks und snippets schreiben
wenn man sich damit mal vertraut gemacht hat, ist das ganze sooo verdammt mächtig und definitiv 100 mal professioneller als wenn man blanko html und php seiten schreibt.
die möglichkeiten sind unbegrenzt. du musst nur sauber arbeiten und lernen wie die einzelnen teile zusammen spielen.
der 3 reiter ist dein verzeichnis von modx, sodass du neue bilder, etc. direct darüber hochladen kannst.
selbstverständlich schreibst du deine stylesheets wie gehabt und bindest sie ein. aber für dein template würdest du z.b. einfach einen chunk schreiben der "head" heißt und dann steht in deinem template zb.
<DOCTYPE html>
<html>
[[$head]]
<body> ....
dann gibt es einen marketplace über den du dir diverse module runterladen kannst. z.b. das login package.
dafür musst du gemäß der doku auf der modx website einfach nur die formulare auf dich anpassen und benutzergruppen erstellen.
und schon hast du einen kompletten loginbereich der noch in benutzergruppen unterteilt ist (z.b. user, mods, admin)
und du hast sowas wie passwort vergessen, registrieren innerhalb von, okay beim ersten mal vielleicht 2 std eingerichtet und der aufruf für den loginbereich auf der website ist [[!login]]
und es gibt noch sooo viele weitere nützliche module die einem sooo viel arbeit abnehmen (upload, frontend-editirung, backendeditoren, gateway-plugin für mehrere websiten mit unterschiedlichen domains in einer modx installation...). das wichtigste ist es als entwickler einfach nur ein schönes design zu schreiben. je sauberer, desto besser. dann mit php und sql (wobei modx sql mit der xPDO api nochmals vereinfacht) serverkommunikation erstellen alles was praktisch vom user kommt, und irgendwie gespeichert werden muss und später wieder in die seite geladen werden muss.
.....
ich könnte noch soooo viel sagen, aber das sprengt das ganze hier glaub eh schon. wenn es dich wirklich interessiert, dann lade dir doch einfach xampp auf den pc runter und installiere darüber modx revolution (bitnami link in xampp). dazu gibts auch genug anleitungen im netz. dann simulierst du praktisch einen server mit webspace und kannst offline den umgang damit lernen.
bei weiteren fragen kannst du mich auch gern persönlich anschreiben.
Also, ich habs jetzt bei mir mal ausprobiert, und zwar alles in einer Datei, Formular und php, und mit a+
Funktioniert, in dem Sinn, dass die Einträge erhalten bleiben
http://pastebin.com/7W4Xmz18
Ohne Worte, Respekt :) Da ist wirklich jetzt ein Danke fällig, eine Frage jedoch wie kommt man auf a+ ? :D
Ganz einfach: es gehört zu fopen dazu.
Es gibt verschiedene Buchstaben (modes, r w c x a), die man angeben kann. Sie haben unterschiedliche Aufgaben, und auch mit + oder ohne macht Verschiedenes. Und für "w" gilt: es "kürzt die Datei auf 0", und zwar mit und ohne + Also alles weg, außer der Datei selbst
Ja aber wenn man das dann wieder auf einer anderen Seite ausgeben will hat man wieder ein invalid variable :/ Also die Datei wäre 2 Ordner höher und dann wieder 2 Ordner tiefer :D Und wenn ich dann im Endeffekt sage <?php include('dateiname.php'); dann steht oben invalid variable... und auf der anderen Seite (also auf der Editseite sind die dann auch wieder invalid keine Ahnung, ist wahrscheinlich schwer realisierbar oder? Wenn du da noch was wüsstest wär's echt perfekt :)
Ich denke hier ist der Hund begraben
$fileHandle = fopen("myDataFile", 'w'); fwrite($fileHandle, $var1); fwrite($fileHandle, $var2); fclose($fileHandle);
'w'
Nur zum Schreiben geöffnet; platziere Dateizeiger auf Dateianfang
und kürze die Datei auf eine Länge von 0. Existiert die Datei
nicht, versuche, diese zu erzeugen.
Das heisst beim 2. Aufruf von fwrite wird das erste fwrite überschrieben.
Dem kannst du entgegen wirken in dem du var1 und var2 verkettest mit "." und dann alles auf einmal mit fwrite schreibst.
Ja ich bin halt auch nicht der größte Profi bzw. generell erst Anfänger, obwohl PHP fast noch logischer ist als Javascript! Ehm ich habe hier die Datei jedoch in einem Paste http://pastebin.com/6xUGZhYR (und ich hab es mit Read schon einmal zusammengefasst, das ist nicht das was ich möchte)
Ich probiers jetzt praktisch zum erklären (und warums überschrieben werden soll)
Ich habe eine Reifenseite, also verkaufe online Reifen! (nur ein Beispiel) Hierzu habe ich eine OnlineEdit Seite mit Login (habe ich schon) (und ja es gibt sicher bessere Lösungsmöglichkeiten ich will es einfach so) Ich habe es bereits geschaft Bilder hochzuladen, jedoch mit Umbenennung in Image1 und pro Bild 1 Upload Element, genauso wie ich es wollte!
Jetzt will ich über diesem Bild einen Titel, den man auch auf dieser EditSeite eingeben soll und absenden kann, der wird dann auch auf der Besucherseite angezeigt, genauso wie die Bilder (Image1 - Image10)
Die generelle Input Eingabe würde ja auch klappen genauso wie ich es will bei einem Reload jedoch ist alles weg und die Variable undefiniert! Dasselbe ist bei der zweiten Möglichkeit mit der externen Datei, wo der Text gespeichert wird. Ich mein irgendwie ist es logisch, dass ich schon langsam ein wenig die Motivation verliere das Problem ist doch nicht von irgendwoher hergeholt, es wird nur scheinbar nirgends behandelt oder man macht das mit JS ich habe keine Ahnung
Schau dich mal um nach einer fertigen Lösung und dergleichen, da sparst du dir die ganze Programmiererei.
Warum versuchst du etwas was du schon im Ansatz nicht verstehst? Das ergibt kein Sinn. Zudem sind das, was du vorhast, alles Grundlagen.
Mein Tipp: Erstmal viel Lesen und sich die entsprechenden Fähigkeiten aneigenen, danach mit der Umsetzung beginnen und nicht ohne Plan etwas starten. Die Welt der Programmierung ist gnadenlos und kennt kein "was nicht passt wird passend gemacht"
Erstmal danke für deine Antwort, so Antworten stell ich mir vor einfach klar ausdrücken was der/die meint :) Sonst immer ewig komplizierte Sachen, die nicht genau erklärt werden. Natürlich bin ich erst Anfänger aber was bringt das ständige Lesen der Theorie, wenn man es sich eh nicht merkt bzw. das Motto eigentlich Lerning per Doing sein sollte und das so ziemlich das komplizierteste der ganzen Homepage ist.
Trotz allem macht es leider überhaupt keinen Unterschied ob man a, c oder w verwendet :/
if(!empty($var1)) { ... in datei schreiben } else { ... aus Datei lesen } ?
Ja nur ich würde gerne aus Zeit-, Wissens- und Berechtigungsgründen auf Datenbanken verzichten mit dem Bildupload hat es ja auch geklappt halt eben mit Image1.jpg, image2.jpg usw...