3

この問題について見つけたすべての投稿を読みましたが、これまでのところ、どの解決策もうまくいきませんでした。明らかに、私は何か重要なことを見落としています。また、セッションをデバッグする方法もわかりません。PHPセッションのデバッグという1つの記事を読みましたが、頭がおかしくなりました。

そのため、他の問題と同様に、リンクまたはフォームの送信を介してアプリの別のページに移動すると、セッションが表示されなくなります。なぜ私のセッションが消えるのか分かりません。誰かが私が調査するのを手伝う時間があれば、それは大いにありがたいです。

これらは私のphp.ini設定です

; Name of the session (used as cookie name).  
session.name = PHPSESSID  

; The path for which the cookie is valid.  
session.cookie_path = /

これは最初に表示されるビューです

<?php
session_start();
if (!isset($_SESSION['session_id'])) {
    $_SESSION['session_id'] = session_id();
}
if (!isset($_SESSION['invoices'])) {
    $_SESSION['invoices'] = $invoices;
}

if (isset($_SESSION['session_id'])) {
    print_r($_SESSION['session_id'] . " in invoiceList.<br />");
} else {
    echo 'No session ID set in invoiceList <br />';
}
?>
<div>

    <table>
        <tr>            
            <th>Customer Name</th>
            <th>Invoice Date</th>
            <th>Invoice Number</th>
        </tr>
        <tr>
            <?php
            include_once 'form/editInvoice.php';
            if (isset($invoices)) {

                foreach ($invoices as $invoice) {
                    ?>
                <tr>
                    <td><?php echo $invoice['customer_name'] ?></td>
                    <td><?php echo $invoice['invoice_date'] ?></td>
                    <td><?php echo $invoice['invoice_number'] ?></td>
                    <td><a href='<?php echo $_SERVER['SCRIPT_NAME']; ?>/retrieve?class=InvoiceLineItems&amp;id=<?php echo $invoice['invoice_id']; ?>'><?php echo $invoice['invoice_id']; ?></a></td>
                </tr>
                <?php
            }
        } else {
            echo 'No invoices retrieved.';
        }
        ?>
        </tr>
    </table>
</div>  

含まれているフォームは次のとおりです。

<?php
session_start();

if (isset($_SESSION['session_id'])) {
    print_r($_SESSION['session_id'] . "in editForm<br />");
} else {
    echo 'No session ID set in editForm <br />';
}

if (!$_POST) {
    ?>

<form action="<?php $_SERVER['PHP_SELF'] ?>" method="post">
        <fieldset>
            <legend>Enter Updated PO Number</legend>
            <li>PO Number: <input type="text" name="po_number"/></li>
        </fieldset>
        <input type="submit" value="Submit" />
        <input type="button" onclick="alert('Changes Canceled.')" value="Cancel"/>
    </form>
<?php }
?>

そして最後に、ユーザーがメインページのリンクをクリックしたときの詳細ページ。

<?php
session_start();

if (isset($_SESSION['session_id'])) {
    print_r($_SESSION['session_id'] . "<br />");
} else {
    echo 'No session ID set invoice<br />';
}
?>

<h1>Invoice Detail</h1>
<div>
<?php
foreach ($partnerInfo as $info) {

    switch ($info['role_indicator']) {
        case 'remit_to':
            ?>
            <div id="remit">
                <ul>
                    <li>PLEASE REMIT TO:</li>
                    <li><?php echo $info['partner_name']; ?></li>
                    <li><?php echo $info['street_name']; ?></li>
                    <li><?php echo $info['city_name']; ?>, <?php echo $info['state']; ?> <?php echo $info['postal_code']; ?></li>

                </ul>
            </div>
            <?php break; ?>
        <?php case 'seller': ?>
            <div id = "seller" >
                <ul>
                    <li>Service Site:</li>
                    <li><?php echo $info['partner_name']; ?></li>
                    <?php
                    if ($info['partner_aux_info'] !== NULL) {
                        ?><li><?php echo $info['partner_aux_info']; ?>
                        <?php }
                        ?>
                    </li>
                    <li><?php echo $info['street_name']; ?></li>
                    <li><?php echo $info['city_name']; ?>, <?php echo $info['state']; ?> <?php echo $info['postal_code']; ?></li>
                    <li>(405)677-0221</li>
                </ul>        
            </div>
            <?php break; ?>
        <?php case 'sold_to': ?>
            <div id="buyer">
                <ul>
                    <li>Bill To: </li>
                    <li><?php echo $info['partner_name']; ?></li>
                    <li><?php echo $info['street_name']; ?></li>
                    <?php
                    if ($info['suite_info'] !== NULL) {
                        ?><li><?php echo $info['suite_info']; ?>
                        <?php }
                        ?>
                    </li>
                    <li><?php echo $info['city_name']; ?>, <?php echo $info['state']; ?> <?php echo $info['postal_code']; ?></li>
                </ul> 
            </div>   
            <?php break; ?>
        <?php
    }
}
?>
<h1>Line Items</h1>
<table>
    <th>PO Number</th>
    <th>PO Issued Date</th>
    <th>Description</th>
    <th>Service Start Date</th>
    <th>Service End Date</th>
    <th>Shipped Date</th>

    <?php foreach ($invoiceLineItems as $lineItem) { ?>
        <tr>
            <td><?php echo $lineItem['po_number']; ?></td>
            <td><?php echo $lineItem['po_issued_date']; ?></td>
            <td><?php echo $lineItem['line_item_name']; ?></td>
            <td><?php echo $lineItem['service_period_start']; ?></td>
            <td><?php echo $lineItem['service_period_end']; ?></td>
            <td><?php echo $lineItem['request_for_delivery']; ?></td>
        </tr>       
        <?php
    }
    ?>

</table>


</div>

編集:セッションチェックを削除し、コードサンプルを更新しました。<head>index.phpのタグの前にsession_start()を追加しました。セッション一時フォルダに書き込めることを確認しました。

コントローラでこのコードを実行して請求書を新しいPO番号で更新すると、モデルの機能に到達しますが、セッションが終了します。

//If form is posted, update line items with PO number and date.
if (isset($_POST['po_number'])) {
    $this->invoice->update();
}

セッション変数の割り当てに到達するまでに、セッションデータがありません。

パブリック関数update(){

$con = $this->_getLocalConn();


$invoices = $_SESSION['invoices'];

try {
    $sqlUpdate = $con->prepare("UPDATE invoices 
                                SET po_number = ?, po_issued_date = ?
                                WHERE invoice_id = ?");

    foreach ($invoices as $record) {
        $sqlUpdate->execute(array(
            $_POST['po_number'],
            getdate(),
            $record['invoice_id']
        ));
    }
} catch (PDOException $e) {
    print $e->getMessage();
}
//get the PO number being used to update the records
//perform db update where po_number = input
//notify user of success and display updated records.

}

4

3 に答える 3

5

session_start();各PHPファイルは、設定されているかどうかに関係なく、で始まる必要が$_SESSIONあります。この関数は、新しいセッションを作成するか、既存のセッションを使用します。

于 2012-05-30T17:38:44.160 に答える
1

セッション情報を必要とするすべてのコードは、で始まる必要がありますsession_start()session_start()ヘッダーやその他の出力が書き込まれる前に発生する必要があります。
その後、セットアップと分解が自動的に処理されます。

私はこれをします:

session_start();
$s = &$_SESSION;

そうすれば、読み取り/書き込み$sを以前と同じように使用できます$_SESSION

自己参照イメージのダウンロードや、並行して実行したくなる可能性のあるその他のコードを実行している場合は、セッションを開始したり、セッションをできるだけ早く閉じたりしないとsession_write_close()、パフォーマンスが大幅に向上します。
これがないと、セッションは基本的にコードをシングルスレッドで実行します。

編集:シングルスレッドと言うのはおそらく悪い言葉の選択でした。3つのiframeを含むページがあり、それぞれが異なる(または同じ)phpスクリプトをロードしているとします。セッションを使用している場合、結果として、iframeが一度にすべてではなく一度に1つずつ読み込まれます。それぞれがセッションをロックし、他の人はsession_start()セッションが再び利用可能になるまで待機します。

于 2012-05-30T17:49:27.927 に答える
1

あなたが最初にそれをチェックするとき、 No$_SESSIONは最初から始まりますif。したがって、常に失敗します。session_start()変数を使用して何かを行う前に、PRIORを呼び出す必要があり$_SESSIONます。コードを修正してください。

先頭ページ:

<?php
session_start();

/* Don't need this unless you really need the debugging
   Previously you where assigning variables that did not 
   exist to the the $_SESSION variables. Not what you want
   I imagine.

if (!isset($_SESSION)) {
    var_dump($_SESSION);

}
*/
...

フォームを含める:

<?php
session_start();

if (isset($_SESSION['session_id'])) {
    print_r($_SESSION['session_id'] . "in editForm<br />");
} else {
    echo 'No session ID set in editForm <br />';
}
...

詳細ページ:

<?php
session_start(); //Notice a pattern here??


if (isset($_SESSION['session_id'])) {
    print_r($_SESSION['session_id'] . "<br />");
} else {
    echo 'No session ID set invoice<br />';
}
?>
于 2012-05-30T18:20:20.067 に答える