PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : SID bei "session.use_trans_sid" deaktiviert


sputnik72
27.10.2005, 10:56:03
Hallo,
ich habe einen Warenkorb mit SESSION erstellt. Allerdings habe ich nun festgestellt, dass auf dem Server, wo die Seiten später mal laufen sollen, "session.use_trans_sid" global deaktivert ist. Das hat zur Folge, dass SESSION keine Werte speichert, d.h. der Warenkorb bleibt leer.
Ich habe in einem anderen Beitrag des Forums gelsen, dass man den SESSION-id dann manuell übergeben muss, mit Hilfe von

<?php
header('Location: meineseite.php?' . SID);
?>

Ich habe allerdings nicht ganz verstanden, wo und wie man diesen Scriptteil auf einer Seite einsetzt .Das hat wohl damit zu tun, dass ich nicht weiss, was z.B. "Location" bewirkt. Über "header" habe ich gelesen, dass damit ein header (was immer das auch ist) abgeschickt wird, der in diesem Fall wohl den sesssion-ID (SID) übermittelt.

Muss das obige Script oben auf jeder Seite stehen? Aber was, wenn von der betreffenden Seite mehrere Links sind, wo der SESSION-id mit geschickt werden muss?
Oder muss header(...) dort eingebaut werden, wo die Links sind, also z.B. hier:

echo ("<b>kr. $pris,-</b>&nbsp;&nbsp;&nbsp;Boknr. $id<br><a href=\"bestilling_no.php?id=$id&herkunft=resultat\"><img src=\"grafikk/velut.png\" border=\"0\"></a></b>");

Aber wo und wie genau?

Ich wäre dankbar wenn jemand mir dieser header/SID-Sache mal genauer erklären könnte.

Gruss Sputnik

sputnik72
29.10.2005, 12:00:54
Dann noch einmal anders gefragt:

Wenn ich SID folgenderweise übergebe, entweder mit

<input type="hidden" name="session" value="<?php print SID; ?>" >

in einem Formular, oder zB. mit

echo ("<p><a href=\"bestillingskurv_no.php?herkunft=bokliste&<?php print SID; ?>\"><img src=\"grafikk/sjaadittutval.jpg\" border=\"0\" alt=\"sj&aring; ditt utval\"></a></p>");

in einem normalen Link (oder muss es &sid=<?php print SID; ?> heissen?),

wie kann ich dann SID auf der Zielseite "annehmen"?

Habe es erfolglos so versucht

if ($_POST['session'] != "") $SID = $_POST['session'];
if ($_GET['session'] != "") $SID = $_GET['session'];

Wär wirklich nett, wenn mir da jemand helfen könnte.

Gruss Sputnik

xabbuh
29.10.2005, 12:45:16
wie kann ich dann SID auf der Zielseite "annehmen"?
Du musst die Sessionid nicht annehmen. Sobald die Funktion session_start() (http://www.php.net/session_start) aufgerufen wird, wird überprüft, ob eine gültige Sessionid per Cookie oder URL übergeben wurde. Ist die Überprüfung positiv kommen die Daten aus dem entsprechenden Sessionfile in das $_SESSION-Array. Wurde dagegen keine gültige Sessionid übergeben, so wird eine neue Sessionid angefordert. Die aktuelle Sessionid kann man mit der Funktion session_id() (http://www.php.net/session_id) ermitteln.

<input type="hidden" name="session" value="<?php print SID; ?>" >
Das ist so nicht richtig. Die Konstante SID wird beim Aufruf von SID definiert. Wenn die Sessionid per Cookie übergeben wird, enthält sie einfach nur eine leere Zeichenkette. Wird sie dagegen per URL übergeben enthält sie eine Zeichenkette in folgendem Format: session_name=session_id.

Auch bist du sehr unflexibel, da du den Namen der Session fest in das Eingabefeld schreibst. Wenn sich nun einmal der Name der Session durch Änderung der PHP-Konfiguration ändert, geht die Session hier verloren.

Besser wäre daher so etwas:

<?php
printf('<input type="hidden" name="%s" value="%s" />',
session_name(),
session_id());
?>

sputnik72
29.10.2005, 15:17:32
Hallo!
Vielen Dank für die Antwort!

Ich habe es probiert wie vorgeschlagen, aber der Warenkorb bleibt nach wie vor leer, d.h. der sessionid wird offensichtlich mit diesem Link hier nicht übergeben:

echo ("<a href=\"bestilling_no.php?id=$id&herkunft=kategori&<?php print SID; ?>\">...</a>");

Oder war der Ansatz auch falsch?

Gruss Sputnik

|Coding
29.10.2005, 18:06:14
Was siehst Du wenn Du diesen Code auf der Seite ausführts:

<?PHP
print SID;
?>

meikel (†)
29.10.2005, 19:17:34
Ich habe es probiert wie vorgeschlagen, aber der Warenkorb bleibt nach wie vor leer, d.h. der sessionid wird offensichtlich mit diesem Link hier nicht übergeben:
Oder war der Ansatz auch falsch?
Ja. Dein echo war etwas seltsam.
Mach es so:
<?php
session_start(); # muß natürlich auf den Folgeseiten ebenfalls aufgerufen werden

# irgend was

# EDIT
printf('<a href="bestilling_no.php?id=$id&herkunft=kategori&%s',
SID);

# restliches Script

|Coding
29.10.2005, 23:12:12
Ich will nicht klugscheißen, aber da fehlt ein Komma meikel :-)

<?php
session_start(); # muß natürlich auf den Folgeseiten ebenfalls aufgerufen werden

# irgend was

printf('<a href="bestilling_no.php?id=$id&herkunft=kategori&%s', SID);
?>

meikel (†)
30.10.2005, 05:20:25
Ich will nicht klugscheißen, aber da fehlt ein Komma meikel :-)
Du solltest, weil da wirklich ein Komma fehlt(e).

sputnik72
30.10.2005, 11:32:44
Was siehst Du wenn Du diesen Code auf der Seite ausführts:

<?PHP
print SID;
?>

Wenn es nur darum geht, SID auszugeben (habe das auch schon geprüft), dann sehe ich nichts. Daher meine Schlussfolgerung, dass SID nicht übergeben wurde.

Habe es jetzt auf der Basis des Vorschlags nun so probiert

printf("<b>kr. $pris,-</b>&nbsp;&nbsp;&nbsp;Boknr. $id<br><a href=\"bestilling_no.php?id=$id&herkunft=kategori&%s\"><img src=\"grafikk/velut.png\" border=\"0\" alt=\"vel ut\"></a></b>), SID");

aber jetzt kommt die Fehlermeldung

Warning: printf(): Too few arguments in /home/bokbyen.no/public_html/kategori_no.php on line 177 (...das ist diejenige welche).

Liegt das an printf in diesem Zusammenhang oder an meinem Script?

Gruss Sputnik

|Coding
30.10.2005, 14:12:25
Wenn Dir bei "print SID" schon nichts ausgegeben wird, dann wird das bei printf doch nicht anders sein.

Der Fehler ist übrigends bei den Doublequotes zu suchen. Genauer bei dem letzten.

xabbuh
30.10.2005, 14:15:36
Liegt das an printf in diesem Zusammenhang oder an meinem Script?
Das wird an deinem Script liegen. Wurde session_start() schon ausgeführt? Was für eine Ausgabe erhälst du bei var_dump(SID)?

meikel (†)
30.10.2005, 15:42:59
Wenn es nur darum geht, SID auszugeben (habe das auch schon geprüft), dann sehe ich nichts. Daher meine Schlussfolgerung, dass SID nicht übergeben wurde.
1. die Konstante SID erstellt PHP nach session_start()
2. die Konsante enthält folgendes:
entweder das Ergebnis von
session_name . '=' . session_id()
wenn der Client den Session Cookie NICHT angenommen hatte
oder einen Leerstring.

Wenn Du die Session_id anzeigen willst, dann so:
echo session_id();

Habe es jetzt auf der Basis des Vorschlags nun so probiert
Lies Dir bitte erst mal die Funktionsbeschreibung von printf() durch. Die Platzhalter im Formatstring werden in sprintf() beschrieben.

sputnik72
02.11.2005, 14:44:55
Hallo!
Also, erstmal zu der korrekten Schreibweise des Scriptteils:


Der Fehler ist übrigends bei den Doublequotes zu suchen. Genauer bei dem letzten.

Ja, ich habe wohl gesehen, dass ihr das ' anders gesetzt habt.

printf('<a href="bestilling_no.php?id=$id&herkunft=kategori&%s', SID);

Aber ich musste ja nun noch den HTML-Link mit </a> schliessen, wo setzt man denn das dann hin? Muss das nicht mit in die ' '-Klammer rein?

Gruss Sputnik

sputnik72
02.11.2005, 15:05:50
Hallo xabbuh!

Das wird an deinem Script liegen. Wurde session_start() schon ausgeführt? Was für eine Ausgabe erhälst du bei var_dump(SID)?

Ja, auf der Seite steht ganz oben session_start().
Bei var_dump(SID) kriege ich:

string(0) "" auf der Seite mit dem Link und auf der Zielseite.

Gruss Sputnik

sputnik72
02.11.2005, 15:34:05
Hallo!

Also die Fehlermeldung bei printf ist jetzt weg:

printf("<b>kr. $pris,-</b>&nbsp;&nbsp;&nbsp;Boknr. $id<br><a href=\"bestilling_no.php?id=$id&herkunft=kategori&%s\"><img src=\"grafikk/velut.png\" border=\"0\" alt=\"vel ut\"></a>", SID);

Aber das Übergeben des SID klappt immernoch nicht. SID enthält auf der Zielseite offensichtlich einen Leerstring, obwohl auf der Seite mit dem obigen Link ein SID als Zeichenfolge existiert. Auf beiden Seiten steht session_start(), und auf meinem eigenen Rechner, wo session.use_trans_sid aktiviert ist, wird der Warenkorb auch gefüllt.

Wo liegt denn bloss der Fehler?

Gruss Sputnik

meikel (†)
02.11.2005, 15:49:37
Noch mal:
ob in SID was drin steht, hängt davon ab, ob der Client den Keks angenommen hatte oder nicht.
Wenn Keksbetrieb, dann SID = ''
wenn KEIN Keksbetrieb, dann SID = session_name() . '=' . session_ide()
Das erledigt PHP bei session_start() auf der Startseite und auf den Folgeseiten.

Wenn also SID erst gefüllt und "ein paar Seiten später" leer ist, dann geht an einer anderen Stelle im Script die Session flöten. Eine beliebte Stelle sind immer wieder falsche Weiterleitungen per Location Header oder falsche POST Formulare.

Da ich Deine php Config nicht kenne: das Geschriebene gilt nur bei halbwegs aktueller PHP Version.

sputnik72
02.11.2005, 23:30:02
Hallo meikel!


Wenn also SID erst gefüllt und "ein paar Seiten später" leer ist, dann geht an einer anderen Stelle im Script die Session flöten. Eine beliebte Stelle sind immer wieder falsche Weiterleitungen per Location Header oder falsche POST Formulare.

Der Einfachheit halber geht es hier ja nur um zwei Seiten. Auf der einen ist der bereits genannte Link:

printf("<b>kr. $pris,-</b>&nbsp;&nbsp;&nbsp;Boknr. $id<br><a href=\"bestilling_no.php?id=$id&herkunft=kategori&%s\"><img src=\"grafikk/velut.png\" border=\"0\" alt=\"vel ut\"></a>", SID);

Und auf der anderen wird der Warenkorb gefüllt:

session_start();

if (!isset($_SESSION[ 'warenkorb' ]))
{
$_SESSION[ 'warenkorb' ] = array();
}
if(empty($_SESSION['warenkorb'])) {
$warenkorb[] = $id;
echo ("<p>Buch wurde der Bestellung hinzugefügt!</p>");
}
else {

$key = array_search($id, $_SESSION['warenkorb']);

if($key !== false) {

echo ("<p>Buch ist bereits bestellt!</p>");
}

else {

$warenkorb[] = $id;

echo ("<p>Buch wurde der Bestellung hinzugefügt!</p>");
}}


Muss ja dann wohl an dem Link liegen.

Da ich Deine php Config nicht kenne: das Geschriebene gilt nur bei halbwegs aktueller PHP Version.

Die php-config des php auf dem Server, auf dem dies alles funktionieren soll, kenne ich leider auch nicht. Die haben da eine phpmyadmin-Version 2.6.2. - gehe davon aus, dass hier eine "halbwegs aktuelle php Version" vorliegt.

Gruss Sputnik

meikel (†)
03.11.2005, 00:48:24
Der Einfachheit halber geht es hier ja nur um zwei Seiten.
Du mußt wissen, welche Infos Du preisgibst, wenn Du Hilfe brauchst.

Auf der einen ist der bereits genannte Link:
1. Um welche PHP Version handelt es sich?
2. ist register_globals = On oder Off?
3. Wo und wie wird auf Seite 1 die Session gestartet?
4. Der Seite 2 ist nicht zu entnehmen, wie der User weiterverfahren soll.

xabbuh
03.11.2005, 09:40:52
Die php-config des php auf dem Server, auf dem dies alles funktionieren soll, kenne ich leider auch nicht. Die haben da eine phpmyadmin-Version 2.6.2. - gehe davon aus, dass hier eine "halbwegs aktuelle php Version" vorliegt.
Dann hilft dir hier phpinfo() (http://www.php.net/phpinfo) weiter. Die Version von phpmyadmin hat dabei erst einmal gar nichts mit der PHP-Version zu tun.

sputnik72
03.11.2005, 12:23:27
Du mußt wissen, welche Infos Du preisgibst, wenn Du Hilfe brauchst.

Tut mir leid falls es den Eindruck erweckt, dass ich hier etwas nicht preisgeben will. Ich dachte nicht, dass man noch mehr von dem Script braucht, um das Problem zu lösen. War aber wohl ein Irrtum.

Also nocheinmal von vorn:

1. Um welche PHP Version handelt es sich?
4.3.10-16 (danke xabbuh!)


2. ist register_globals = On oder Off?
Off.

3. Wo und wie wird auf Seite 1 die Session gestartet?
session_start();
if (!isset($_SESSION[ 'warenkorb' ])) {
$_SESSION[ 'warenkorb' ] = array();
}
Auf dieser Seite wird mit Hilfe einer Datenbank eine Buchliste generiert. Hinter jedem Buch gibt es einen Link (vel ut)

printf("<b>kr. $pris,-</b>&nbsp;&nbsp;&nbsp;Boknr. $id<br><a href=\"bestilling_no.php?id=$id&herkunft=kategori&%s\"><img src=\"grafikk/velut.png\" border=\"0\" alt=\"vel ut\"></a>", SID);

mit dem der Kunde das Buch in den Warenkorb legen kann.

4. Der Seite 2 ist nicht zu entnehmen, wie der User weiterverfahren soll.
Der Link führt auf seite 2, wo eben dies geschieht, inklusive einer Meldung, dass dies geschehen ist (siehe scvript unten) und einem Link zurück zur Liste.
session_start();
if (!isset($_SESSION[ 'warenkorb' ])) {
$_SESSION[ 'warenkorb' ] = array();
}
if(empty($_SESSION['warenkorb'])) {
$warenkorb[] = $id;
echo ("<p>Buch wurde der Bestellung hinzugefügt!</p>");
}
else {
$key = array_search($id, $_SESSION['warenkorb']);
if($key !== false) {
echo ("<p>Buch ist bereits bestellt!</p>");
}
else {
$warenkorb[] = $id;
echo ("<p>Buch wurde der Bestellung hinzugefügt!</p>");
}}

var_dump(SID) ergibt auf beiden Seiten string(0) ""
print session_id(); ergibt auf beiden Seiten jetzt den gleichen ID, was anscheinend bedeutet, dass der Sessionid nun wunschgemäss übergeben wird. Ansonsten würde doch auf Seite 2 ein neuer Sessionid generiert, oder? Dann muss der Fehler also woanders liegen...

Das Füllen des Warenkorbs läuft auf meinem eigenen Rechner (im Folgenden 'Rechner' genannt) einwandfrei, jedoch auf dem Server (im Folgenden 'Server' genannt), auf dem die Seiten laufen sollen, nicht, was anscheinend an den Servereinstellungen liegt.

Was ich bereits weiss ist, dass "session.use_trans_sid" auf dem Server deaktiviert ist, zusätzlich zu register_globals=off.

Wenn es nicht an dem übermittelten SID liegt, woran kann es denn dann noch liegen?

Gruss Sputnik

meikel (†)
03.11.2005, 13:39:34
Ich dachte nicht, dass man noch mehr von dem Script braucht, um das Problem zu lösen.
Es gibt verschiedentlich semantische Fehler, die sehr gut versteckt sind. Manchmal liegt es ganz simpel daran, daß durch falsche Konfiguration PHP nicht in den session.save_path schreiben darf oder daß der Pfad falsch ist/nicht existiert.

Auf dieser Seite wird mit Hilfe einer Datenbank eine Buchliste generiert. Hinter jedem Buch gibt es einen Link (vel ut)
Das ist etwas krötig.
printf('<b>kr. %s,-</b>&nbsp;&nbsp;&nbsp;Boknr. %s<br>
<a href="bestilling_no.php?id=%s&herkunft=kategori&%s">
<img src="grafikk/velut.png" border="0" alt="vel ut"></a>',
$pris,
$id,
$id,
SID);
Das verstehe ich allerdings nicht: herkunft=kategori

und einem Link zurück zur Liste.
Und der Link fehlt im Script. Der Link ist deshalb wichtig, weil auch dort SID für den Fall mit angehängt werden muß, wenn der Client keinen Keks will.

var_dump(SID) ergibt auf beiden Seiten string(0) ""
Teste das erst mal so, daß Du einmal den Keks nimmst und beim nächsten Mal die Keksannahme verweigerst. Sowas geht sehr bequem mit dem FireFox.

Mit Keks: SID = ''
Ohne Keks: SID = session_name() . '=' . session_id()

... was anscheinend an den Servereinstellungen liegt.
Die sollte man sich genauer angucken. Geht mit phpinfo()

Script 2 verstehe ich ehrlich gesagt nicht:
session_start();
if (!isset($_SESSION[ 'warenkorb' ]))
{
$_SESSION[ 'warenkorb' ] = array();
}
if(empty($_SESSION['warenkorb']))
{
$warenkorb[] = $id;
echo ("<p>Buch wurde der Bestellung hinzugefügt!</p>");
}
else
{
$key = array_search($id, $_SESSION['warenkorb']);
if($key !== false) {
echo ("<p>Buch ist bereits bestellt!</p>");
}
else #<-- mehr als ein else
{
$warenkorb[] = $id;
echo ("<p>Buch wurde der Bestellung hinzugefügt!</p>");
}
} # <-- Klammer ist zuviel
Abgesehen von den Syntaxfehlern:
1. Warum speicherst Du $warenkorb nicht in der Session?
2. warum nimmst Du $id nicht gleich als Index für den Warenkorb?
3. Wenn register_globals = Off ist: wo wird $id gesetzt?
4. Warum machst Du es nicht so?
if (! isset($_SESSION['warenkorb']) AND ! is_array($_SESSION['warenkorb']))
{
$_SESSION['warenkorb'] = array();
}

# sicherstellen, daß nur ein numerischer Wert verwendet wird
$_GET['id'] = (! isset($_GET['id']))
? false
: intval(trim($_GET['id']));

# besser wäre, wenn die id direkt verglichen werden könnte

if ($_GET['id'] == false OR $_GET['id'] == 0)
{
echo '<p>Fehlerhafte Auswahl.</p>'; # id war leer oder nach intval() = 0
}
else
{
if(isset($_SESSION['warenkorb'][$_GET['id']]))
{
echo '<p>Buch ist bereits bestellt!</p>'; #
}
else
{
$_SESSION['warenkorb'][$_GET['id']] = 1; # so wird die Session gefüllt
echo '<p>Buch wurde der Bestellung hinzugefügt!</p>';
}
}
printf('<a href="%s?%s">Zur&uuml;ck zur Liste</a>',
'liste.php',
SID); # Der Link zurück

sputnik72
04.11.2005, 21:48:17
Hallo meikel,
vielen Dank für die vielen Anregungen! Ich brauche etwas Zeit, um alles auszuprobieren (habe nicht regelmässig Zeit dafür).

Gruss Sputnik

sputnik72
06.11.2005, 14:32:40
Hallo meikel,
da der session-id ja zum Schluss doch übergeben wurde lag es denke ich am Füllen der Session warenkorb (obwohl es auf meinem eigenen Rechner funktionierte...).


4. Warum machst Du es nicht so?
...
else
{
$_SESSION['warenkorb'][$_GET['id']] = 1; # so wird die Session gefüllt
echo '<p>Buch wurde der Bestellung hinzugefügt!</p>';
}
[/php]

Wofür ist den das ' = 1 ' in dem Befehl zum Füllen des Warenkorbes da? Bei mir hat das jetzt zur Folge, dass id=1 gesetzt wird und ich immer nur den gleichen Artikel in den Warenkorb gelegt bekomme, obwohl andere Artikel ausgewählt wurden. Hab schon probiert das '=1' wegzulassen, aber dann wird gar nichts hinzugefügt.

Gruss Sputnik

meikel (†)
06.11.2005, 15:08:08
Wofür ist den das ' = 1 ' in dem Befehl zum Füllen des Warenkorbes da?
Guck Dir mal eine ganz normale Rechnung an. Dort findest Du die Artikelnummer und die dazugehörige Menge. In Deinem Falle (als Beispiel):
Du verwendest die ID aus der Datenbankabfrage als Artikelnummer
$_SESSION['warenkorb'][123456789] = 1;
Bedeutet:
Liefere vom Artikel 123456789 die Menge 1 Stück.

Wenn Du den Warenkorb auswertest:
foreach($_SESSION['warenkorb'] as $nummer => $menge)
{
if ($menge < 1) continue; # den Artikel will der Kunde nicht mehr
# Tu was mit $nummer und $menge
}
Bei mir hat das jetzt zur Folge, dass id=1 gesetzt wird und ich immer nur den gleichen Artikel in den Warenkorb gelegt bekomme, obwohl andere Artikel ausgewählt wurden.
Dann ist offenbar die ID nicht numerisch. Dann mußt Du den Teil des Scriptes verändern, in dem $_GET['id'] überprüft wird. Da hatte ich wohl fälschlicherweise angenommen, id wäre ein auto_increment Feld aus der Datenbank.

sputnik72
07.11.2005, 14:58:04
Hallo meikel!

Du verwendest die ID aus der Datenbankabfrage als Artikelnummer
$_SESSION['warenkorb'][123456789] = 1;
Bedeutet:
Liefere vom Artikel 123456789 die Menge 1 Stück.

Diese Funktion brauche ich nicht, da man jeweils nur ein Stück von den Artikeln bestellen kann. Daher reicht bei mir die Abfrage, ob der Artikel schon im Warenkorb ist, und wenn ja wird eine entsprechende Meldung ausgegeben.

Ansonsten kann ich vermelden, dass es jetzt doch endlich hinhaut. Ich musste es allerdings so machen:
session_start();

if (! isset($_SESSION['warenkorb']) AND ! is_array($_SESSION['warenkorb']))
{
$_SESSION['warenkorb'] = array();
}
# sicherstellen, daß nur ein numerischer Wert verwendet wird
$_GET['id'] = (! isset($_GET['id']))
? false
: intval(trim($_GET['id']));
# hier wird geprüft, ob der id schon im warenkorb vorhanden ist
if ($_GET['id'] == false OR $_GET['id'] == 0)
{
echo ('<p>Fehler bei der Auswahl.</p>'); # id war leer oder nach intval() = 0
}
else
{
$key = array_search($_GET['id'], $_SESSION['warenkorb']);
if($key !== false) {
echo ("<p>Das Buch wurde bereits bestellt!</p>");
}
else
{
$_SESSION['warenkorb'][] = $_GET['id']; # so wird die Session gefüllt
echo ('<p>Das Buch wurde der Bestellung hinzugefügt!</p>');
}
}
Gibt es daran php-technisch was auszusetzten oder kann man das so machen?

Dann ist offenbar die ID nicht numerisch. Dann mußt Du den Teil des Scriptes verändern, in dem $_GET['id'] überprüft wird. Da hatte ich wohl fälschlicherweise angenommen, id wäre ein auto_increment Feld aus der Datenbank.
Doch, das Feld id ist schon auto_increment!

Vielen Dank schonmal für die Hilfe, auch an die anderen Beteiligten!

Gruss Sputnik

meikel (†)
08.11.2005, 14:40:07
$_SESSION['warenkorb'][123456789] = 1;
Diese Funktion brauche ich nicht, da man jeweils nur ein Stück von den Artikeln bestellen kann. Daher reicht bei mir die Abfrage, ob der Artikel schon im Warenkorb ist, und wenn ja wird eine entsprechende Meldung ausgegeben.
Quark.

$key = array_search($_GET['id'], $_SESSION['warenkorb']);
Doppelquark.

$_SESSION['warenkorb'][] = $_GET['id'];
Dreifachquark.

Du lebst Deine Erkenntnisresistenz ganz schön aus. Wenn ich das vorher gewußt hätte, hätte ich mir alle Texte zum Thema komplett sparen können.

Gibt es daran php-technisch was auszusetzten oder kann man das so machen?
Nein, darauf antworte ich nicht mehr.

sputnik72
08.11.2005, 17:42:44
Deine Scriptvorschläge haben bei mir nicht funktioniert, sofern ich sie richtig verstanden hatte...

Daher habe ich eben weiter herumprobiert.
Ich habe mir das alles aber nicht aus den Fingern gesaugt. Den Scriptteil, der die Artikel im Warenkorb registrieren soll, habe ich aus einem anderen Warenkorbbeispiel, das allerdings etwas veraltet sein könnte.

Was ist denn nun eigentlich falsch an den Scripten?

Sputnik

|Coding
08.11.2005, 18:46:40
Hallo!

Ich bitte Euch das per PM zu klären, wenn da weiterer Bedarf besteht.

sysop
08.11.2005, 23:33:36
es funktioniert scheinbar....
sorry, aber du zerlegst da code, der eigentlich alles beinhaltet, was du brauchst. zuerst ging es ja nur um die sessionsid, die nicht übergeben wurde. aber gut...


$_SESSION['warenkorb'][123456789] = 1;


wird angelegt, damit die folgende suche auch ein ergbnis bringen kann.


else
{
$key = array_search($_GET['id'], $_SESSION['warenkorb']);
if($key !== false) {
echo ("<p>Das Buch wurde bereits bestellt!</p>");
}


hier wird nach dem muster getestet, das dir von meikel vorbereitet wurde. du wirst erst dann ein ja finden, wenn $_SESSION['warenkorb'][artikelnummer] gefunden wird. es wird also geprüft, ob es $_SESSION['warenkorb'][4711] gibt, wenn deine artikelnummer 4711 ist.


else
{
$_SESSION['warenkorb'][] = $_GET['id']; # so wird die Session gefüllt
echo ('<p>Das Buch wurde der Bestellung hinzugefügt!</p>');
}
}
Gibt es daran php-technisch was auszusetzten oder kann man das so machen?

man kann das so machen, nur willst du das oder besser ist dir klar, was $_SESSION['warenkorb'][] = $_GET['id'] eigentlich macht ??

hier wird bei jedem aufruf ein array fortlaufend nummeriert aufgebaut, das die artikelnummer enthällt. also
$_SESSION['warenkorb'][1] = 4711
$_SESSION['warenkorb'][2] = 0815
$_SESSION['warenkorb'][3] = 1234

sputnik72
09.11.2005, 14:07:56
Hallo sysop,
ja, mit dazugehöriger Erklärung leutet mir das natürlich ein, vielen Dank!

Aber ich verstehe leider immernoch nicht dieses
$_SESSION['warenkorb'][123456789] = 1;
Das legen der Artikel in den Warenkorb funktioniert jetzt. Aber es wird immer automatisch auch der Artikel mit dem id 1 mit in den Warenkorb gelegt. Das muss doch an dem obigen Skript liegen, oder? Oder habe ich es an die falsche Stelle gesetzt?

Hier das Script, wie es jetzt aussieht:

session_start();

if (! isset($_SESSION['warenkorb']) AND ! is_array($_SESSION['warenkorb']))
{
$_SESSION['warenkorb'] = array();
}

# sicherstellen, daß nur ein numerischer Wert verwendet wird

$_GET['id'] = (! isset($_GET['id']))
? false
: intval(trim($_GET['id']));


$_SESSION['warenkorb'][123456789] = 1;

# hier wird geprüft, ob der id schon im warenkorb vorhanden ist

if ($_GET['id'] == false OR $_GET['id'] == 0)
{
echo ('<p>Det skjedde ein feil ved utvalet av boka.</p>'); # id war leer oder nach intval() = 0
}

else
{
$key = array_search($_GET['id'], $_SESSION['warenkorb']);

if($key !== false) {
echo ("<p>Boka er allereie registrert som bestillt!</p>");
}
else
{
$_SESSION['warenkorb'][] = $_GET['id']; # so wird die Session gefüllt
echo ('<p>Boka blei lagd til i bestillinga di!</p>');
}
}

Gruss Sputnik

meikel (†)
09.11.2005, 15:26:02
Aber ich verstehe leider immernoch nicht dieses
$_SESSION['warenkorb'][123456789] = 1;
Das legen der Artikel in den Warenkorb funktioniert jetzt. Aber es wird immer automatisch auch der Artikel mit dem id 1 mit in den Warenkorb gelegt. Das muss doch an dem obigen Skript liegen, oder? Oder habe ich es an die falsche Stelle gesetzt?
Das war nur ein Beispiel, damit Du den Mechanismus verstehst. Diese Zeile gehört natürlich nicht mit ins Script.

sputnik72
09.11.2005, 21:46:53
Hallo,
also in der Theorie habe ich es glaube ich fast verstanden, aber leider nur fast:

Auch wenn Ihr sicher schon des Themas müde seid, ich muss doch leider nochmal nachfragen (denn ich war zu voreilig mit der Meldung, dass es funktionierte. War doch noch teilweise das alte Script).

Also, das Füllen des Warenkorbs:

$_SESSION['warenkorb'][$_GET['id']] = 1; # so wird die Session gefüllt


Ich kriege es leider damit nicht hin. Oder ist das hier auch ein Beispiel?
Wenn ich das so einsetzte wird immer nur der Artikel mit dem id 1 in den Warenkorb gelegt, was mir ja auch irgendwie einleuchtet, wenn ich mir die Zeile angucke.
Ich weiss wirklich nicht, wie ich es richtig machen soll.
Wäre nett, wenn Ihr mich da nochmal auf den richtigen Pfad bringen würdet.

Gruss Sputnik

sputnik72
09.11.2005, 23:20:46
Hallo nochmal,
also jetzt zweifle auch ich bald an meinem Verstand....

Ich habe jetzt also nochmal genau meikels Script eingesetzt, und jetzt kriege ich eine Fehlermeldung

Warning: Cannot use a scalar value as an array

nach der Zeile, in der der Warenkorb gefüllt werden soll.

meikel (†)
10.11.2005, 03:36:26
Hallo nochmal,
also jetzt zweifle auch ich bald an meinem Verstand....
Damit der Jammer endlich ein Ende hat: Guck Dir das Script an...
http://test.php-help.info/warenkorb-1/ (Quelltext wird angezeigt)
... und versuch es zu verstehen.

Zusatz:
ich verwende PHP 5.0.4

sputnik72
10.11.2005, 10:29:49
Hallo,
leider hilft mir das nicht weiter. Ich verstehe ja mittlerweile alle die schönen Beispielscripte. Aber ich bekomme mit deren Hilfe mein Warenkorbscript nicht hin (das steht ja weiter oben).
Die oben genannte Fehlermeldung kommt übrigens nur, wenn der Warenkorb am Anfang leer ist. Danach tritt das Phänomen mit Artikel 1 auf.

Aber Du brauchst jetzt nicht weiter Deine Nerven strapazieren. Ich denke, ich geb's auf und behelfe mir bis auf weiteres mit der falschen, aber funktionierenden Lösung.
Danke nochmal für die Mühe!

Gruss Sputnik

meikel (†)
10.11.2005, 19:27:44
Hallo,
leider hilft mir das nicht weiter. Ich verstehe ja mittlerweile alle die schönen Beispielscripte. Aber ich bekomme mit deren Hilfe mein Warenkorbscript nicht hin (das steht ja weiter oben).
Das ist ein funktionierendes Script.