Cookies in einer Funktion verwenden

  • Hallo zusammen,
    ich habe ein kleines Problem.
    Ich habe ein Kontaktformular, in dem Daten von Benutzern eingegeben werden, wie z.B.:

    <input type="text" name="Vorname" id="vorname" />

    Nach der Eingabe kann der Benutzer auf einen "Button" klicken und es sollen zwei Funktionen ausgeführt werden:

    <a id="calcCheck" onclick="calcCheck(), cookieSave();">Abschicken</a>

    Die Funktion calcCheck befindet sich hierbei in einem javascript und wird auch problemlos aufgerufen, jedoch nicht die Funktion cookieSave, welche sich in der gleichen PHP-Datei befindet und wie folgt aussieht:

    function cookieSave()
    {
    setcookie("vorname",$Vorname, time()+60*60);
    }
    ?>

    Für mich gibt es da zwei Fehlermöglichkeiten: Entweder er ruft die Funktion erst garnicht auf oder er kann die Variablen, die er als Cookies verwenden soll, nicht finden.
    Ich hoffe ihr könnt mir sagen, woran es liegt und wie ich diesen Fehler beheben kann.

    Vielen dank schonmal im Voraus!

    Grüße

  • Okay, dann ist das schon mal ein Fehler.
    Tut mir leid, bin noch nicht so ganz fit in PHP.

    Ich wollte mit $Vorname im Prinzip die Eingabe des Benutzers abfangen, aber anscheinend hab ich das syntaktisch falsch angestellt. Wie lässt es sich denn realisieren, dass ich die Eingabe im Cookie ablege?

  • naja du kannst beim rendern der seite den vornamen mit javascript ja onsubmit schon als cookie setzen
    oder du prüfst php-seitig nach abschicken des formulars (was man oben übrigens auch nirgendwo sieht) was in deinem $_POST bzw $_GET-array drinsteht. und setzt dann das kekslein via php.

    und du musst dich net entschuldigen, wenn du noch nich fit bist in php... jeder hat mal irgendwann angefangen. und die sprache benutzen zu können i des eine, programmiertechnisch zu denken, zu abstrahieren und dann umzusetzen is des andere :)

  • Na, da wär mir die zweite Variante doch um Einiges lieber..in javascript mit Cookies zu arbeiten ist ein bisschen umständlicher, soweit ich weiß(vielleicht irre ich mich ja auch). Und außerdem sollen die Cookies in einem anderen PHP-Formular wieder ausgelesen werden.

    Aber ich weiß jetzt wirklich nicht, wie ich mein $_POST- oder $_GET-Array deklariere. Der Punkt ist ja, dass sich die funktion cookieSave() auf dem gleichen Formular befindet wie

    <input type="text" name="Vorname" id="vorname" />

    Ich könnte den Wert ja in javascript über

    document.getElementById("vorname").value

    auslesen, aber wäre einfach zu umständlich.

    Das Abschicken des Formulars wird durch

    <a id="calcCheck" onclick="calcCheck(), cookieSave();">Abschicken</a>

    bewerkstelligt, ist zwar kein richtiger Button, aber Funktionieren tut es. Was danach geschieht, spielt auch erstmal keine Rolle, abgesehen vom Aufruf der Funktion cookieSave(). Und mehr ist da auch nicht.

    Wenn ich das nun alles ein wenig abändere und ein Gerüst in Form von

    <form action="db.php" method="post" name="form" id="form">
    <input type="text" name="Vorname" id="vorname" />
    <input type="submit" onclick="calcCheck(), cookieSave()" value="Abschicken" />

    anlege und in der Funktion cookieSave() Folgendes schreibe:

    setcookie("nachname",$_POST['Nachname'], time()+60*60);

    dann bringt das auch nix.

    Was habe ich denn da falsch gemacht?

    Ich glaub ja immer noch, dass die Funktion cookieSave() garnicht aufgerufen wird.

  • Sorry, natürlich lautet die neue Form:

    <form method="post" name="form" id="form">
    <input type="text" name="Vorname" id="vorname" />
    <input type="submit" onclick="calcCheck(), cookieSave()" value="Abschicken" />

    Die Form-Action war nur ein Test gewesen.

  • naja nachname haste ja nich im formular, sondern vorname ;)
    und wenn du javascript-sachen bei nem formular machst, sollten die onsubmit gesetzt werden.
    und der button sollte dann auch nen type="submit" haben.
    dein post-array füllt sich automatisch durch das abschicken des formulars. die auswertung sollte bei dir dann in der db.php stattfinden (also immer in der datei, die in action drin is)
    dann is deine cookie-save-funktion doch ne php-funktion oder? die kannste dann nämlich nich mit javascript aufrufen..

    sondern musst sowas hier machen.

    PHP
    if(isset($_POST['Vorname']) && !empty($_POST['Vorname'])){
    cookieSave($_POST['Vorname']);
    }

    und in deine save-funktion sollte den namen als parameter bekommen...

    also so ungefähr:

    PHP
    function cookieSave($Vorname)
    {
    	setcookie("vorname",$Vorname, time()+60*60);
    }


    und nutz bitte für codes die entsprechenden schaltflächen beim editor, das macht des ganze lesbarer :)

  • Okay, sorry, falsch kopiert :D Vorname oder Nachname wäre in meinem Fall unwichtig, da ich beides im Formular habe, hab halt nurn Ausschnitt genommen, damits nicht zu unübersichtlich wird.

    Aber was ich geschickt habe, war leider nicht ganz richtig und nur eine "Vorgängerversion". Die db.php wird erst in der calcCheck(), welche in javascript ist und auch ohne Probleme läuft, aufgerufen. Die db.php dient, wie der Name vielleicht schon verrät, nur zur Übertragung in die Datenbank und sollte die bereits gesetzten Cookies nur aufrufen. Die Funktion cookieSave() ist eine php-funktion und befindet sich auch in der index.php.

    Die Parameterübergabe ist für mich jetzt schon mal eine nützliche Information. :)
    Und okay, ich habe das jetzt auch so eingerichtet, dass calcCheck() über onSubmit aufgerufen wird, aber die Funktion cookieSave() soll im gleichen Moment, also im Prinzip parallel dazu beim Buttonklick aufgerufen werden. Und das ist jetzt mein einziges Problem: wie sage ich dem Submit-Dingens, dass er cookiesave($_POST['Vorname'] aufruft?

    Weißt du, wie ich das meine?

    Vielleicht stell ich mich auch einfach nur zu blöd an. :D

  • also die frage ist wieso du überhaupt den umweg über nen cookie gehen willst...
    da kann jemand seinen keks ändern und du hast schmock in der db, den du da nich haben willst.
    schreib doch die infos aus dem formular direkt in die db.

    ansonsten, wenn du von dienem vorhaben nicht abweichen willst:
    schreibe eine separate datei die keks.php, an die schickste das formular ab, wie ich dir oben zeigte machste dann ne parameter-übergabe (evtl auch 2 parameter also dass du den namen und den wert vom keks als parameter eingibst)
    schreibst deine kekse, machst noch keine ausgabe in form von echo oder so, sondern machst nachdem die kekse geschrieben sind eine weiterleitung auf die db.php und liest dort die kekse aus, um des in deine db zu schreiben

  • sondern machst nachdem die kekse geschrieben sind eine weiterleitung auf die db.php und liest dort die kekse aus, um des in deine db zu schreiben


    Und warum dann nicht Sessions benutzen? ;)

  • Für die Verwendung von Cookies hab ich zwei Gründe:
    1. Die Daten, welche in der DB abgelegt werden sollen, sind nicht nur in dem einen Formular, sondern ebenfalls in anderen Formularen vorhanden. Natürlich könnte man auch eine Getter- und Setter-Klasse bauen, aber das wär ja noch umständlicher.
    2. Weil der Auftraggeber das so wollte :D

    Naja, Sessions könnte ich in dem Sinne nicht gebrauchen, weil diese ja nur auf dem aktuellen Formular gültig sind...oder nicht? Hab ich zumindest mal gelesen...

    Aber okay, dann werde ich das mit der Extra-Datei cookies.php versuchen, vielleicht klappts ja dann besser. :)

    Aber vielen Dank für die rasche Hilfe!

  • Wenn du hier dauernd davon schreibst PHP-Funktionen über onclick-Events aufzurufen, weckt das bei mir die Befürchtung, dass du die Differenzierung zwischen Client- und Server-Seite nicht verstanden hast. Es ist aus Javascript nicht möglich PHP-Funktionen aufzurufen (man kann höchstens mit Ajax einen gewissen Workaround bauen).

    Und Sessions sind so lange gültig, wie der User auf deiner Seite ist und den Browser nicht schließt, völlig egal wieviel er da rumsurft und welche unterschiedlichen Formulare er aufruft. (Eingeschränkt natürlich durch die Einstellungen der max_lifetime)

    "Programming today is a race between software engineers
    striving to build bigger and better idiot-proof programs,
    and the universe trying to build bigger and better idiots.
    So far, the universe is winning."
    Rick Cook

  • Naja, es gibt noch Vieles, was ich in PHP/javascript nicht verstanden habe :D.

    Und Sessions kann ich nicht nehmen, weil der Chef auf Cookies besteht. Ist ja nicht mein Bier.

    Aber okay, mit synaptics Umweg funktioniert das Ganze jetzt endlich!

    Vielen Dank nochmal für den guten Support!


  • Und Sessions kann ich nicht nehmen, weil der Chef auf Cookies besteht. Ist ja nicht mein Bier.



    Grundsätzlich ist soetwas eine eher schlechte Einstellung. Als Webentwickler bist Du der Profi, der Auftraggeber hat meistens keine Ahnung von den technischen Hintergründen und will irgendwelche Sachen die er irgendwo mal aufgeschnappt hat ohne wirklich zu wissen was dahintersteckt. Und da fällt es mit in deinen Aufgabenbereich den Auftraggeber über unsinnige oder sogar gefährliche Forderungen (-> Sicherheitslücken) aufzuklären.
    "Der will das so also mach ich es so ohne weiter darauf einzugehen, obwohl ich es besser weiß" ist halt nicht sehr sozial.
    Wenn ein Auftraggeber von mir etwas fordert was ich für falsch halte weise ich ihn darauf hin und erkläre ihm ganz genau wieso ich das für falsch halte. Wenn er dann weiter darauf besteht lasse ich mir diese Forderung nochmal ganz explizit von ihm unterschreiben, damit etwaige Probleme die daraus entstehen ganz klar auf seine Kappe gehen. Oder, bei Forderungen die gravierende Sicherheitslücken öffnen würden, lehne ich den Auftrag ab und lass ihn sich jemand anderen suchen der den Pfusch umsetzt.

    In diesem Fall ist es jetzt nicht so eine Riesensache. Trotzdem macht es keinen Sinn auf Sessions zu verzichten und ausschließlich Cookies zu verwenden. Cookies können beim Client deaktiviert sein oder auch vom Client manipuliert werden. Zwei Probleme die bei Sessions wegfallen. Cookies wären hier in meinen Augen höchstens eine optionale Ergänzung, wenn es um Daten geht die auch bei späteren Seitenbesuchen noch verfügbar sein sollen.

    "Programming today is a race between software engineers
    striving to build bigger and better idiot-proof programs,
    and the universe trying to build bigger and better idiots.
    So far, the universe is winning."
    Rick Cook

  • Okay, ich muss dazu sagen, dass ich diesen Auftrag nicht direkt vom Chef, sondern vom Projektleiter, welcher als Webentwickler schon ein wenig erfahrener ist, erhalten habe. Ich bin der unerfahrene Neueinsteiger und so gesehen seine Vertretung. Und ich denke mal, es wird seine Gründe haben, wieso er darauf bestand, Cookies zu verwenden.

    Ich wollte damit jetzt nicht zum Ausdruck bringen, dass es mir vollkommen egal ist, was mit der Webanwendung geschieht. Aber ich denke, dass er dies schon aus einem bestimmten Grund, welcher mir noch unbekannt ist, wollte.

    Und soweit ich keine weiteren Infos von ihm erhalte, möchte ich nicht mit einer anderen Lösung ankommen, auch wenn Sessions in dem Fall wirklich sinnvoller sind.

    Also nein, ich bin kein "asozialer" Webentwickler. :D

  • Das wollte ich auch nicht unterstellen. ;)

    Ich habe nur festgestellt, dass viele Entwickler sich der von mir angesprochenen Punkte nicht wirklich bewußt sind. Da steckt in den seltensten Fällen böse Absicht hinter.

    "Programming today is a race between software engineers
    striving to build bigger and better idiot-proof programs,
    and the universe trying to build bigger and better idiots.
    So far, the universe is winning."
    Rick Cook

  • Ich würde mit meinem Projektleiter reden. Erkläre ihm, warum du Sessionsfür besser hältst und frage, warumer auf Cookies besteht. Macht bestimmt einen guten Eindruck, wenn du mit Verbesserungsvorschlägen ankommst.