2016-05-13 3 views
1

セッションが正常に動作するためには、htmlを出力する前にsession_startを呼び出す必要があります。たとえば、この質問htmlを出力した後のPHPのsession_start

を:"Cannot send session cache limiter - headers already sent"

しかし、この例では、それをしないと、それは動作します:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 
<html> 

<head> 
    <title>Counting with the SESSION array</title> 
</head> 
<body> 
<FORM action="counter-session.php" method="GET"> 
<INPUT type="submit" name="Count" value="Count"> 
<?php 
    session_start(); 
    if (! isset($_SESSION['counter'])) 
     $count = 0; 
    else 
     $count = $_SESSION['counter']; 
    $count = $count + 1; 
    $_SESSION['counter'] = $count; 
    echo "count is $count"; 
?> 
</FORM> 

</body> 
</html> 

、期待通りにカウンタが増加していること。どうして?

追加の質問:それは(すなわち$_SESSIONへのさらなる変更は、我々は別のページから$_SESSION変数を使用して、次回に反映されません。)session_destroyが呼ばれた後、$_SESSIONに格納されている任意の更なるデータが保存されないというのは本当ですか?

+0

[output_buffering](http://php.net/manual/en/outcontrol.configuration.php#ini.output-buffering)ini設定を確認してください。 'on'やint値のようなものに設定されていれば、この種の間違いをすることができます... – Zimmi

+0

間違って、これは期待された動作ではないと思いますか? –

+0

その単語を引用する必要があります;)。 「間違い」とは、効果的に出力を作成し、ヘッダーを送信することを意味します。ヘッダーはhtml出力の前に送信する必要があります。出力バッファリングは、サーバーやホスティングによって大きく異なる(設定または未設定、およびバッファのサイズが変更される)設定であり、明示的に設定する必要はありません。 – Zimmi

答えて

1

私はそれをテストしましたが、状況は出力バッファリングから来ています。

確認する場合は、セッションを開始する前にob_end_flush();を追加するだけです。

+0

出力がバッファされる原因は何ですか? ob_start()で明示的に有効にする必要があると思いましたか? –

+0

Nevermindは、Zimmiのコメントを見て、自分の設定をチェックし、出力バッファリングが有効になっています。 –

関連する問題