Setcookie

Alles, was PHP betrifft, kann hier besprochen werden.

Setcookie

Postby casig » 08. November 2010 21:00

Durch

setcookie("name", "text", time()+3600);

kommt folgende Warnung:

Warning: Cannot modify header information - headers already sent by (output started at C:\xampplite\htdocs\Vogelstimmen\FOUND.php:11) in C:\xampplite\htdocs\Vogelstimmen\FOUND.php on line 72

Ein Auslesen der Information ist nicht möglich.
Läßt die Standard-Installation von XAMPPLITE den Einsatz von setcookie zu oder muß php.ini noch angepaß werden?
Hat jemand eine Idee?
casig
 
Posts: 20
Joined: 19. October 2010 18:02

Re: Setcookie

Postby WilliL » 08. November 2010 22:13

Willi
WilliL
 
Posts: 619
Joined: 08. January 2010 10:54
XAMPP Version: 5.5.19
Operating System: Win7Home Prem 64 SP1

Re: Setcookie

Postby Altrea » 09. November 2010 06:02

casig wrote:Läßt die Standard-Installation von XAMPPLITE den Einsatz von setcookie zu oder muß php.ini noch angepaß werden?

Sie lässt den Einsatz zu, selbstverständlich.

casig wrote:Hat jemand eine Idee?

Es liegt einzig an deiner Implementierung. Cookies können nur gesetzt werden, wenn die Meta-Informationen der Seite, also die Headers nochnicht erstellt wurden. Diese Headers werden immer dann gesendet, wenn der Server schon (Teil-)informationen in Textform (Ausgaben, Fehlermeldungen, ByteOrderMarks) weitergeben musste, bevor die jeweilige Funktion aufgerufen wird die die Header manipulieren muss.

Spezifischer kann ich da nicht werden, da wir absolut garnichts über dein Script wissen.
We don't provide any support via personal channels like PM, email, Skype, TeamViewer!

It's like porn for programmers 8)
User avatar
Altrea
AF Moderator
 
Posts: 6494
Joined: 17. August 2009 13:05
XAMPP Version: 5.5.19
Operating System: W7Ux64

Re: Setcookie

Postby casig » 09. November 2010 20:27

Der Tip mit dem Googeln des Fehlercodes ist an sich eine super Sache. Allerdings zeigt die Anzahl der ermittelten Einträge von über 600.000, dass hier doch ein verbreitetes Problem vorliegt. Was ich daraus gelesen habe, dass Leerzeichen/ -zeilen Ursache sein können, hat mich bisher nicht wirklich weiter gebracht. Auch der Versuch, einen Scriptblock im Head-Bereich mit einzig der Anweisung SETCOOKIE zu setzen , verursachte die gleiche Warnung.

Wo sind denn nun Leerzeichen konkret verboten?
casig
 
Posts: 20
Joined: 19. October 2010 18:02

Re: Setcookie

Postby Altrea » 09. November 2010 20:30

Dann ist der erste Schritt:

Sieh dir deine ausgegebene Seite im Sourcecode des Browsers an.

Siehst du dort ganz vorne eine Ausgabe, weißt du wo du suchen musst.
Siehst du dort keine, ist deine Script Datei sehr wahrscheinlich als UTF-8 MIT ByteOrderMark gespeichert. Speichere es OHNE BOM dann sollte sich das Problem erübrigen.

P.S.: Es würde auch nichts schaden deinen Code mal hier zu posten. So hätte ich es fix mal bei mir testen können. So kann ich nur ins blaue tippen.
We don't provide any support via personal channels like PM, email, Skype, TeamViewer!

It's like porn for programmers 8)
User avatar
Altrea
AF Moderator
 
Posts: 6494
Joined: 17. August 2009 13:05
XAMPP Version: 5.5.19
Operating System: W7Ux64

Re: Setcookie

Postby WilliL » 09. November 2010 22:30

Was für einen Texteditor nutzt du zur Erstellung Deines Codes?
Willi
WilliL
 
Posts: 619
Joined: 08. January 2010 10:54
XAMPP Version: 5.5.19
Operating System: Win7Home Prem 64 SP1

Re: Setcookie

Postby casig » 10. November 2010 19:06

Moin Moin,
ich nutze den Microsoft Script Editor. Der ist zwar nicht für PHP gedacht, aber ich kann HTML testen, bevor ich daraus eine Ausgabe durch PHP mache. Gestern gerade ist mir auf meinem Dienstrechner Notepad++ aufgefallen, dies scheint sich auch für PHP zu eignen?! Besonders die Nummerierung der Zeilen ist vortrefflich.)
Altrea, Dein Vorschlag lag mir gestern auf der Zunge, mit anderen Worten, ich würde Dein Angebot gern annehmen. Ich habe selbst einmal die erste der beiden Dateien im IE geöffnet und mir dann den Quellcode anzeigen lassen: ziemlich verworrenes Zeug: <br /> finde ich in meinen PHP-Code nicht.
Hier also der Code:

<HTML>
<HEAD>
</HEAD>
<BODY>
<?php
setcookie("name", "wert", time()+3600);
Last edited by casig on 12. November 2010 07:22, edited 1 time in total.
casig
 
Posts: 20
Joined: 19. October 2010 18:02

Re: Setcookie

Postby Altrea » 10. November 2010 19:30

casig wrote:Gestern gerade ist mir auf meinem Dienstrechner Notepad++ aufgefallen, dies scheint sich auch für PHP zu eignen?! Besonders die Nummerierung der Zeilen ist vortrefflich.)

Mein Editor der Wahl. Ist klein, superschnell und tut einfach genau das was er soll. Wenn du Notepad++ länger verwendest wirst du sicher noch die eine oder andere weitere Funktion lieben lernen.

casig wrote:Altrea, Dein Vorschlag lag mir gestern auf der Zunge, mit anderen Worten, ich würde Dein Angebot gern annehmen.

Dann machen wir das doch mal eben fix :D

Code: Select all
<HTML>
<HEAD>
</HEAD>
<BODY> <-- HIERDURCH WERDEN DIE RESPONSE-HEADERS GENERIERT, DIE DIR DEIN SCRIPT ZERSCHIESSEN
<?php
setcookie("name", "wert", time()+3600); <-- DA DIE RESPONSE-HEADERS BEREITS GESENDET WURDEN, MECKERT PHP ZU RECHT HIER RUM


Der Rest ist für dein Problem irrelevant.
Nun musst du nurnoch herausfinden, woher diese HTML Tags zu Anfang kommen.
Kurz gesagt: Das setcookie() muss spätestens vor dem </HEAD> kommen, am besten aber noch vor jedlicher Ausgabe wie HTML-Tags oder echos.
We don't provide any support via personal channels like PM, email, Skype, TeamViewer!

It's like porn for programmers 8)
User avatar
Altrea
AF Moderator
 
Posts: 6494
Joined: 17. August 2009 13:05
XAMPP Version: 5.5.19
Operating System: W7Ux64

Re: Setcookie

Postby casig » 10. November 2010 19:57

Ich habe setcookie einmal vor <html> gesetzt mit dem Ergebnis, dass keine Warnung. Danke Dir

Nun aber zum Zweck des Einsatzes. In den Referenzen zu PHP wird setcookie als eine Möglichkeit des Datenaustausches zwischen verschiedenen Scripten empfohlen. Nur welchen praktischen Nutzen habe ich davon, wenn die Daten erst im Verlaufe der Abarbeitung des Scriptes entstehen, z.B durch Datenbankrecherchen. Muss ich doch mit versteckten Formularfeldern arbeiten?

Ist Notepad++ eigentlich Freeware?
casig
 
Posts: 20
Joined: 19. October 2010 18:02

Re: Setcookie

Postby Altrea » 10. November 2010 20:14

casig wrote:Ich habe setcookie einmal vor <html> gesetzt mit dem Ergebnis, dass keine Warnung. Danke Dir

Freut mich, dass es geklappt hat :D

casig wrote:Nur welchen praktischen Nutzen habe ich davon, wenn die Daten erst im Verlaufe der Abarbeitung des Scriptes entstehen

Du musst in größeren Dimensionen denken. Das praktischste Beispiel was mir gerade einfällt wäre:
Mit einem Cookie kannst du prüfen, ob ein User deine Homepage zuvor schonmal besucht hat (und wenn ja, zum Beispiel seine personenbezogenen Einstellungen und Daten aus der Datenbank holen). Und da du die Lebenszeit des Cookies selber festlegst, kann zwischen den Besuchen quasi eine undefiniert lange Zeitspanne liegen, natürlich immer vorausgesetzt, der User löscht oder manipuliert das Cookie nicht. Und genau hier liegt auch die Schwachstelle von Cookies. Sie werden beim User direkt gespeichert. Der User kann sie einsehen, und sogar verändern.

Deshalb:
- speichere NIE sensible Daten
- Verlass dich nicht drauf, dass dein Cookie vom User nicht gelöscht wird
- und am aller wichtigsten: Vertrau keinen Daten aus Cookies (generell aus Usereingaben)

Das Gegenstück zu Cookies sind Sessions. Über Sessions kannst du Sitzungsinformationen auf dem Server speichern und über Seiten hinweg transportieren, OHNE zig hidden Fields Formulare benutzen zu müssen.
Das geht aber schon sehr in den theoretischen Bereich über. Wenn du Sessions oder Cookies brauchst wirst du schon von selbst wieder drauf zurückkommen.

casig wrote:Ist Notepad++ eigentlich Freeware?

Notepad++ steht unter der GPL Lizenz. Umgangssprachlich ja, könnte man es als Freeware bezeichnen. Über Notepad++ kannst du dich genauer auf dessen Homepage informieren.
We don't provide any support via personal channels like PM, email, Skype, TeamViewer!

It's like porn for programmers 8)
User avatar
Altrea
AF Moderator
 
Posts: 6494
Joined: 17. August 2009 13:05
XAMPP Version: 5.5.19
Operating System: W7Ux64

Re: Setcookie

Postby Nobbie » 10. November 2010 20:56

Altrea wrote:Kurz gesagt: Das setcookie() muss spätestens vor dem </HEAD> kommen, am besten aber noch vor jedlicher Ausgabe wie HTML-Tags oder echos.


Hoppla - da hast Du aber noch ein kleines aber bitterböses Verständnisproblem. Das setcookie() muss nicht SPÄTESTENS vor </head> und nicht "am besten" vor jeglicher Ausgabe von HTML-Tags, sondern es muss GANZ UNBEDINGT vor der jeglicher Ausgabe (auch von HTML Tags) kommen. Vor "</head>" ist es hoffnungslos zu spät.

Die "<head>" HTML Anweisung hat NICHTS(!) mit den angemotzten HTTP Headern zu tun - letzteres sind die Protokoll Header des Protokolls HTTP, die der Browser gar nicht erst anzeigt, a la "Content-Type: text/html" oder eben auch "Cookie:" u.v.m. - und die müssen naturgemäß zwischen Client und Server ausgetauscht werden, bevor überhaupt die erste Zeile "Inhalt" gesendet wird. Und bereits "<HTML>" (und auch der hier fehlende DOC-Header) sind aus Sicht des Protokolls HTTP einfach nur "Inhalt". Der Tag "<head>" ist ein Header in der Schicht unter der HTTP Schicht, nämlich ein HTML Header (nicht zu verwechseln mit dem HTTP Header), der spezielle Eigenschaften dieses HTML Dokuments festlegt.
Last edited by Nobbie on 10. November 2010 21:07, edited 1 time in total.
Nobbie
 
Posts: 6502
Joined: 09. March 2008 13:04

Re: Setcookie

Postby Altrea » 10. November 2010 21:06

Kein Problem, man lernt nie aus.
Vielen Dank für die neuen Erkenntnisse :)

P.S.: Bei sovielen Headers habe ich mich wohl etwas verHeadert.
Muhahaha, was für ein Brüller :D
We don't provide any support via personal channels like PM, email, Skype, TeamViewer!

It's like porn for programmers 8)
User avatar
Altrea
AF Moderator
 
Posts: 6494
Joined: 17. August 2009 13:05
XAMPP Version: 5.5.19
Operating System: W7Ux64

Re: Setcookie

Postby Nobbie » 10. November 2010 21:24

Um das noch einmal zu präzisieren:

die setcookie()-Anweisung resultiert letztendlich darin, dass der HTTP-Header um die Angabe eines Cookie-Wertes ergänzt wird. Ohne es getestet zu haben, behaupte ich einfach mal, das könnte man genauso mit einer "header('Cookie....');" hinbekommen, wobei man dann dort eben die genaue Syntax für HTTP Cookies kennen muss (weiß ich auch nicht ad hoc).

Und dieser HTTP Header wird zwischen Server und Client ausgetauscht, man verständigt sich darüber, was nun im folgenden heruntergeladen wird (da steht auch die Größe der Datei u.v.m. drin). Und weil eben die Cookie-Daten zum HTTP-Header gehören, kann man sie nicht mehr übermitteln, wenn das HTTP Protokoll schon den Header ausgetauscht hat und die ersten Daten über die Leitung gegangen sind (wie beispielsweise "<HTML>").

Deswegen gibt es auch die Umgehungslösung, die Daten zu puffern (beispielsweise mit ob_start() etc.). Dann dadurch werden ge-echo-te Daten nicht direkt gesendet (selbst schieres HTML wird gepuffert), auch der HTTP-Header befindet sich in dem Puffer und alle header()-Aufrufe, auch alle setcookie()-Aufrufe u.v.m resultieren lediglich darin, dass an der "richtigen Stelle" im Puffer die gewünschten Daten zur Verfügung stehen. Deswegen kann man mit einem simplen Aufruf von ob_start() am Anfang des Scripts das Problem auch lösen - nur ob das dem Verständnis dient, das bezweifele ich. Im Gegenteil: das Puffern kann man auch durch eine Direktive in php.ini veranlassen, und deswegen laufen Script auf einmal nicht mehr, wenn sie in so einer Konfiguration entwickelt wurden (der Entwickler merkt seinen Fehler gar nicht) und dann in einem anderen Umfeld gestartet werden - da kommt dann auf einmal diese "Horrormeldung" dass die "HTTP Headers already sent" sind - was der 0815-Anwender nicht im Ansatz versteht....
Nobbie
 
Posts: 6502
Joined: 09. March 2008 13:04

Re: Setcookie

Postby Altrea » 10. November 2010 21:31

Nobbie wrote:Deswegen gibt es auch die Umgehungslösung, die Daten zu puffern (beispielsweise mit ob_start() etc.).

Wo du es gerade ansprichst, kann ich dich auch direkt etwas dazu fragen. Ich habe mich immer gefragt, wie ich diese Funktion einordnen soll. Vom Prinzip her klingt das ja alles so als hätte man dadurch nur Vorteile. setcookie() ist ja auchnicht die einzige Funktion die die Headers manipuliert. Wie handhabst du das? Würdest du dazu raten diese Funktion prinzipiell einfach einzusetzen, oder gibt es dabei auch gewisse Nachteile die man in Kauf nehmen muss?
We don't provide any support via personal channels like PM, email, Skype, TeamViewer!

It's like porn for programmers 8)
User avatar
Altrea
AF Moderator
 
Posts: 6494
Joined: 17. August 2009 13:05
XAMPP Version: 5.5.19
Operating System: W7Ux64

Re: Setcookie

Postby Nobbie » 11. November 2010 09:29

Nachteile kenne ich keine - ich benutze sie selbst auch. Allerdings benutze ich sie nicht, um fehlerhaften PHP Code zu umgehen...

Ich benutze sie in Zusammenhang mit komprimierter Datenübertragung, obwohl es da schon lange Standardlösungen gibt, aber ich habe mir mal selbst was gebastelt und nehme das dann auch immer wieder. Einen Nachteil von ob_start() usw. kenne ich wie gesagt nicht. Allenfalls dass man die Zusammenhänge zwischen HTTP und HTML noch schlechter versteht als ohne Buffering.
Nobbie
 
Posts: 6502
Joined: 09. March 2008 13:04

Next

Return to PHP

Who is online

Users browsing this forum: No registered users and 1 guest