PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : session bleibt nicht erhalten?


feuervogel
17.04.2004, 19:05:16
hallo!

es geht um ein forum: wenn man einen beitrag schreiben will, aber vergisst name oder inhalt zu tippen, soll das gleiche formular wieder erscheinen, mit einer kleinen fehlermeldung und dem, was man bereits eingegeben hat.

wenn ich schreibe

if ( $post_author == "" || $post_content == "" )
{
$_SESSION[ 'post_author' ] = $post_author;
$_SESSION[ 'post_email' ] = $post_email;
$_SESSION[ 'post_content' ] = $post_content;
$_SESSION[ 'post_message' ] = "Sie haben vergessen eines der Felder auszufüllen";
session_write_close();
Header( "Location:{$_SERVER[ 'HTTP_REFERER' ]}#new_post" );
}

wird man auf die nächste seite weitergleitet, aber die session ist leer (bis auf $_SESSION[ 'post_message' ]). wenn ich es aber so schreibe:

if ( $post_author == "" || $post_content == "" )
{
$_SESSION[ 'post_author' ] = $post_author;
$_SESSION[ 'post_email' ] = $post_email;
$_SESSION[ 'post_content' ] = $post_content;
$_SESSION[ 'post_message' ] = "Sie haben vergessen eines der Felder auszufüllen";
print_r( $_SESSION );
#session_write_close();
#Header( "Location:{$_SERVER[ 'HTTP_REFERER' ]}#new_post" );
}

wird die session korrekt ausgegeben. die variablen sind also gesetzt, nur die session scheint den inhalt zu verlieren...?!?

was mach ich falsch?

edit:

könnte es daran liegen?

ob_start();
session_start();

NanoCyte
18.04.2004, 01:20:18
also ganz kann ich dir denk ich mal nicht helfen, aber arbeite nicht mit dem REFERER, das ist tödlich, weil net jeder browser den wirklich sendet

ansonsten musst du immer session_start() BEVOR nur ein leerzeichen ausgegeben wird machen, dann sollte es auch funktionieren

was soll das bewirken : session_write_close();
ist überflüssig

meikel (†)
18.04.2004, 04:50:42
Original geschrieben von NanoCyte
was soll das bewirken : session_write_close();
ist überflüssig
Die Session muß geschrieben und geschlossen werden, bevor der Client "weg" ist und keine Daten mehr entgegen nimmt. PHP erledigt das nur dann automatisch nach Scriptende, wenn das Script nicht mittels exit oder einer neuen Location verlassen wurde.

Der Feuervogel sollte mal zum Test auf die header Befehle verzichten und stattdessen folgendes eintragen, die Inhalte seiner Variablen zu verfolgen:
print ('<pre>');
print_r ($_SESSION);
print_r ($_COOKIE);
print ('</pre>');
exit;

feuervogel
18.04.2004, 09:10:20
hi meikel,

so früh noch oder schon wach?

also, das mit session_write_close(); ist nicht überflüssig, denn so stehts im manual:



It is a good idea to call session_write_close() before proceeding to a redirection using

header("Location: URL");
exit();

because it ensures the session is updated (in a file or into a database, depending on the handler you're using) BEFORE you redirect the visitor somewhere else.

JP.

das problem ist ja, dass wenn ich den header weglasse, ist die session ja schön gefüllt...nur wenn ich mit header den redirect mache, dann nicht :-/

werd heute noch mal etwas rumprobieren, dankeschön jedenfalls schon mal!

@nanocyte: welche browser haben denn kein referer?

p.s.: das mit dem leerzeichen hab ich schon überprüft, sonst würde ich die frage nicht stellen;)

Progman
18.04.2004, 10:14:59
Wie wird die Session-ID übermittelt? Ubergib sich vorsichshalber beim Location-Redirect.

$_SERVER['HTTP_REFERER'] würde ich nicht als Redirect-URL nehmen, denn dieser Wert kann auch leer sein und dann kriegst du ein "500 Internal Error"-Fehler.

feuervogel
18.04.2004, 11:35:58
hm, also alle anderen variablen der session sind ja noch erhalten, nur

$_SESSION[ 'post_author' ] = $post_author;

$_SESSION[ 'post_email' ] = $post_email;

$_SESSION[ 'post_content' ] = $post_content;

nicht...also die session erkennt er...

Progman
18.04.2004, 11:57:02
Voher kommen eigentlich $post_author, $post_email und $post_content?

siehe:
http://faq.php-q.net/#error

NanoCyte
18.04.2004, 13:32:15
okay, das mit session_write_close() kannte ich auch noch net, wieder was neues gelernt

@feuervogel: Referer kann man abschalten, kann verändert werden und wenn die User über nen Proxy kommen ist der Referer sowieso weg

feuervogel
18.04.2004, 13:40:12
@nanocyte: oh, danke!

@progman:

daher kommen sie:

$post_author = $_POST[ 'post_author' ];
$post_email = $_POST[ 'post_email' ];
$post_content = $_POST[ 'boardcontent' ];

sie sind auch gesetzt. wie gesagt, wenn ich header(); auskommentiere ist alles so wie es sein soll, nur danach nicht mehr...

meikel (†)
18.04.2004, 17:51:40
Original geschrieben von feuervogel
>so früh noch oder schon wach?

noch

>das problem ist ja, dass wenn ich den header weglasse, ist die
>session ja schön gefüllt...nur wenn ich mit header den redirect
>mache, dann nicht :-/

Welche PHP Version? Nur zur Erinnerung: PHP 4.1.x ist sehr zickig, wenn es um Session geht.

Ansonsten sehe ich ehrlich gesagt die Notwendigkeit eines redirect nicht so recht ein. Ich selbst präsentiere dem User entsprechend dem jeweiligen Modus so lange unterschiedliche Formulare, bis ich alle Infos zusammen habe, um sie verarbeiten zu können.

Das ganz Script basiert immer auf einem einzigen via HTTP erreichbaren PHP Script... Redirectt verwende ich nur beim Logout oder einem fehlgeschlagenem Login.

>@nanocyte: welche browser haben denn kein referer?

Wozu brauchst Du das denn? Wenn es für das Script wichtig ist, wie der vorhergehende URL hieß, dann speicherst Du den in der Session. Dann hast Du einen "Client-Wert" weniger, den Du überprüfen mußt.

feuervogel
18.04.2004, 19:28:16
so, ich habe nun rausgefunden, dass es noch bei einem anderen script auf dem server...ist php 4.3.4...muss man da irgendwas besonderes beachten in bezug auf sessions?

hab da vor allem das gesehen:

session
Session Support enabled
Registered save handlers files user

so, ich habe mal ein test-script verfasst, welches unter php 4.2.2 perfekt läuft, aber unter o.g. server nicht mehr:-/


<?PHP
ob_start();
session_start();
$text = $_POST[ 'text' ];
echo '<a href="./test.php?mode=eingabe">eingabe</a> | <a href="./test.php">nur zeigen</a>';
echo '<pre>';
var_dump( $_SESSION );
echo '</pre>';
if ( $_GET[ 'mode' ] == "eingabe" ) {
?>
<form name="form1" method="post" action="./test.php?mode=ausgabe">
<input name="text" type="text" id="text">
<input type="submit" name="Submit" value="Submit">
</form>
<?php
}
elseif ( $_GET[ 'mode' ] == "ausgabe" ) {
$_SESSION[ 'text' ] = $text;
echo "eingabe erfolgt";
}
ob_end_flush();
?>


dort steht dann als ausgabe nach einigen klicks:

array(1) {
["text"]=>
&NULL
}

und das & ist ja klaro...referenz...

also, mein testscript scheint nun zugehen, wenn ich folgende 2 zeilen änder:

$_SESSION[ 'text' ] = $_POST[ 'text' ];

und andererseits:

#$text = $_POST[ 'text' ];

jetzt muss ich schauen, ob das auch in dem großen script dann läuft...

ja, das tut es...aber wieso das so sein muss bleibt und ist mir ein rätsel...oh mann...

meikel (†)
19.04.2004, 09:59:48
Original geschrieben von feuervogel
so, ich habe nun rausgefunden, dass es noch bei einem anderen script auf dem server...ist php 4.3.4...muss man da irgendwas besonderes beachten in bezug auf sessions?
Bei PHP 4.3.4? Eigentlich nicht (korrekte Konfiguration vorausgesetzt).

ja, das tut es...aber wieso das so sein muss bleibt und ist mir ein rätsel...oh mann...
Da das, was Du machen willst, im Allgemeinen kein Problem ist, würde ich mich an Deiner Stelle mal eindringlich mit Deinem Provider unterhalten. Es geht nicht an, daß Du damit Deine Zeit verplemperst. Auf Seite1.php einen Sack voll Variablen in der Session zu speichern und auf Seite2.php weiter zu verwursten, ist auf einem sauber konfiguriertem System eigentlich kein Thema.

feuervogel
20.04.2004, 23:57:00
der provider ist soweit ich weiß internet24, zum glück nicht meiner, sondern der eines kundens...ich vertraue z.z. ner kleinen firma namens behosted...