PHP Cookieänderung nicht möglich

raffiSSL

Lt. Junior Grade
Registriert
Feb. 2006
Beiträge
289
Hallo Community.
Ich habe wie aus der Überschrift zu lesen ein Problem mit dem Ändern von Cookies, welche beim ersten Aufruf der Webseite korrekt gesetzt werden.
Ich habe das ganze derzeit folgendermaßen gelöst in der index.php:
PHP:
<?php
if (!isset($_COOKIE["userid"])) {
  setcookie("userid", "Gast");
} 
if (!isset($_COOKIE["sid"])) {
  setcookie("sid", "test"); // Session ID
}
if (!isset($_COOKIE["itemids"])) {
  setcookie("itemids", "0"); // String mit Produktnummern durch Komma getrennt
}
?>
<html>
...
 <div id="wrapper">
    <div id="navi">
          <?php include("categories.php"); ?>  // dynamisch erzeugte Navi aus Baumstruktur
    </div>
    <div id="content">  //Inhalt beim Klick auf Navi-Link
			<?php 

				if (isset($_GET["go"])) {

					switch ($_GET["go"]) {

						//Navilinks	

						case 'basket': 	include ("basket.php");

										break;

										

						case 'myprofile':	include ("myprofile.php");

											break;

											

						case 'shop':	include ("overview.php");

										break;

													

						case 'food':	$_GET["cid"] = "food";

										include ("overview.php");

										break;

                                                .......
	                                      }

				}

				else {

					include("overview.php");

				}	

		?>
    </div>
 </div>
</html>
Soweit so gut, das klappt. Cookies sind laut Cookiemanager im FireFox korrekt gesetzt.
Nun folgt der Teil wo es klemmt:
Wenn ich nun einen Content aufrufe und in dieser PHP-Datei das Cookie ändern möchte passiert dies einfach nicht (klingt salopp ist aber eben so).
Änderung geschieht bspw. in der basket.php folgendermaßen, nach Aufruf im case von:
PHP:
...
// Dieser case steht nicht oben aber in meiner index.php
case xxx:  $_GET["pid"] = "1";
                include("basket.php");
                break;
...
PHP:
<?php
$productID = $_GET["pid"];

if ($_COOKIE["itemids"] == "0") {
   $_COOKIE["itemids"] = $productID;
}
else {
  $itemids = $_COOKIE["itemids"];
  $_COOKIE["itemids"] = $itemids.",".$productID; // anfügen und durch Komma separieren
...
}
?>

Allerdings nimmt er immer nur einen Wert auf, setzt diesen aber beim nächsten Klick wieder komplett auf "0". Also kurz: Bei jedem Klick wird $_COOKIE["itemids"] = "0" gesetzt.

Mir will sich nicht ganz erschließen warum.
Getestet habe ich das ganze mit dem Apache2 unter Ubuntu 10.04.

Ich hofe das reicht an Infos.
Danke
 
Danke, ja das weis ich. Aber ich kann setcookie doch nur am Anfang der index.php nutzen. Wenn ich bspw. setcookie in der basket.php aufrufen würde, wäre dies ein Setzen eines Cookies mitten im Quelltext, und das geht nicht (darf man nicht!?). Also setze ich die Cookies beim ersten Seitenaufruf und ändere diese dann im Verlauf nur noch ab, oder besser gesagt so habe ich mir es vorgestellt. :p


MfG
 
Also soweit ich weiß gehören die Cookie-Angaben in den Header.
Und darin müssen auch die passenden Werte enthalten sein.
(Ist also erstmal Wurst ob du die später änderst oder anlegen willst. Damit die aktiv werden musst du erst die Seite reloaden)

Aber du bringst mich gerade schwer ins grübeln ob das nicht gehen müsste...
Kann leider gerade nichts testen, aber ich würde mal folgende beiden Sachen testen:
(Kann dir selbst nicht sagen ob die beiden Möglichkeiten gehen, musst einfach halt immer wieder reloaden die Seite. Kanns hier leider nicht testen.)

test1.php
PHP:
<?php
echo $_COOKIE["Test"];
if (!isset($_COOKIE["Test"])) {
setcookie("Test", 123);
}
else {
setcookie("Test", $_COOKIE["Test"]+1);
}
echo $_COOKIE["Test"];
?>

test2.php
PHP:
<?php
echo $_COOKIE["Test"];
if (!isset($_COOKIE["Test"])) {
setcookie("Test", 123);
}
else {
$_COOKIE["Test"]++;
}
echo $_COOKIE["Test"];
?>
Am Anfang müsste du womöglich mal das erste echo rausnehmen
 
Zuletzt bearbeitet:
Hallo, an deiner Stelle würde ich das nicht mit Cookies machen sondern nur mit Sessions und die automatisch per Cookie übergeben lassen.

PHP:
// Erzwingen das Session-Cookies benutzt werden und die SID nicht per URL transportiert wird
ini_set( 'session.use_only_cookies', '1' );
ini_set( 'session.use_trans_sid', '0' );
 
// Session starten
session_start();
 
// Sicherstellen das die SID durch den Server vergeben wurde
// um einen möglichen Session Fixation Angriff unwirksam zu machen
if (!isset( $_SESSION['server_SID'] ))
{
    // Möglichen Session Inhalt löschen
    session_unset();
    // Ganz sicher gehen das alle Inhalte der Session gelöscht sind
    $_SESSION = array();
    // Session zerstören
    session_destroy();
    // Session neu starten
    session_start();
    // Neue Server-generierte Session ID vergeben
    session_regenerate_id();
    // Status festhalten
    $_SESSION['server_SID'] = true;
}

Damit hast du deine Session etwas abgesichert und nun kannst du einfach alles in der Session speichern und musst dich auch nicht mehr um die Sessionid kümmern
 
Hallo, und danke. Ich werde morgen mal beiden Varianten von te one testen.
Das mit den Sessions hatte ich auch schonmal irgendwo gelesen, aber nur ganz flüchtig. Werde mich darüber aber auf alle Fälle auch nochmal informieren.

Vllt. noch ein paar Worte zum Einsatzszenario:
Es soll nur ein kleiner Shop entstehen, der zu Vorführungszwecken auf Messen, Schulungen u. ä. dienen soll. Der eigentliche Hintergrund ist eine Empfehlungsmaschine welche in Echtzeit verschiedenartige Produktempfehlungen auswirft. Wichtig dafür sind vorerst eigentlich nur die Webshop-Standardaktionen "Lege in den Warenkorb" (auch mehrere Produkte, daher das Cookie mit den Produktnummern), "Kaufe Produkt" und "Logge dich ein" (Cookie "userid").
Der Shop muss also keinen Sicherheitskriterien allererster Güte genügen, aber schaden kanns ja nicht.

MfG

EDIT: achja, jetzt weis ich warum das mit dem "setcookie"-Befehl in den anderen php-Dateien nicht funktioniert hat. Er meldet dann den Fehler: "can't change (oder so ähnlich) header-information...was written in...".
Ergänzung ()

Hallo,
habe heute die Idee mit den Sessions mal umgesetzt und das funktioniert wunderbar. Wenn ich das vorher gewusst hätte :D

Also danke für die Denkanstöße und einen schönen Tag noch.

MfG
 
Zuletzt bearbeitet:
Zurück
Oben