3

セッション変数が保存されないという問題をすべて調べましたが、問題が見つからないので、質問します。

一度送信すると、データベースでその名前を検索するフォームがあります。最初のフォームはページ 1 にあります。ページ 2 では、ページ 1 から変数を取得し、次のように保存します。

    $searchTerm = $_POST['find'];

これはデータベースの検索として使用され、完全に機能します。その下にSQLステートメントがあり、これを配置しました

    //initialize the session
    if (!isset($_SESSION)) {
      session_start();
    }
    $_SESSION['searchTerm'] = $searchTerm;

次に、2 ページ目の $_SESSION['searchTerm'] をテストして、正しく保存されていることを確認しました。2ページ目からフォームの確認ページである3ページ目に移動しようとすると、問題が発生します.3ページ目の上部にセッション開始句があり、挿入さえしました

ini_set('display_errors',1); 
error_reporting(E_ALL); 

エラーを確認しましたが、エラーは表示されませんでした。したがって、次のステップは、セッション自体をテストして、セッション ID が更新されているかどうかを確認することでした。このサイト www.webassist.com/forums/posts.php?id=5735 でスクリプトを見つけて、サーバーが問題を引き起こしている可能性があるかどうかをテストしました。スクリプトは問題なく正常に動作し、サーバーに問題がないことを示しています。ただし、2番目と3番目のページをサーバーにアップロードして入れると

    <?php echo session_id(); ?>

ページ 2 とページ 3 の数値がまったく異なるため、変数が null になります。私はさらに調査を行い、session_destroy または session_unset があったためではないかと考えましたが、どちらのページにもこれらのいずれも配置しませんでした。ローカル マシンでこれを試したところ、同じセッション ID が得られましたが、設定したセッション変数は空白のままでした。

これがどのように、またはなぜ起こるかについて、他に考えがある人はいますか?

** * ** * ****編集** * ** * ** * ** * ** * ** * ** *

ページ1にはこのフォームがあります

                <form name="search" method="post" action="page2.php">
                    <div>
                    <!-- Search-->
                    <label>Search by Last Name:</label>
                        <div>
                            <table width="100%">
                                <tr>
                                    <td><input type="text" id="" name="find" placeholder=""></td>
                                    <td><button id="submit" type="submit"><span>Search</span></button></td>
                                </tr>
                            </table>
                        </div>
                    </div>
                </form> 

ページ2

    $searchTerm = $_POST['find'];


    if(!empty($searchTerm ) && ctype_alpha($searchTerm ))
    {
    $whereclause = "WHERE mytable.lastName = '".$searchTerm ."'";
    }
    else {
    $whereclause = "";
    }

    // sql query is here this one searches it is long and just used the $whereclause above.

    // second sql query that is only submitted if button from the form below is hit is here.

    $insertGoTo = "confirmPage3.php";
      if (isset($_SERVER['QUERY_STRING'])) {
        $insertGoTo .= (strpos($insertGoTo, '?')) ? "&" : "?";
        $insertGoTo .= $_SERVER['QUERY_STRING'] ;

      }
      header(sprintf("Location: %s", $insertGoTo));

    //initialize the session
    if (session_id() == '') {
      session_start();
    }
    $_SESSION['searchTerm'] = $searchTerm;


    // then the form is listed below that with the rest of the html 

3ページ

    <?php if(session_id() == '') session_start(); ?> 

    if(!empty($_SESSION['searchTerm']) && ctype_alpha($_SESSION['searchTerm']))
    {
    $whereclause = "WHERE myTable.lastName = '".$_SESSION['searchTerm'] ."'";
    }
    else {
    $whereclause = "";
    }

    // More sql statement here for this one it is only selecting not updating or changing anything.

    // Table below this that is used to hold the items retrieved from the database.

** * ** * ** * ** edit 2 と私の修正* ** * ** * ** *

それで、何人かの返信の後、アーロン・ゴングは、空白のページから始めて、そこから始めることを提案しました。私はこれを行い、最終的に問題を診断しました。それは私が考えていなかったもので、私が持っているべきものでした。私は Dreamweaver を使うのが好きではありませんが、その理由を思い出しました。最初にページ 2 を作成したとき、dreamweavers 挿入コードを使用して SQL ステートメントを挿入し、更新を行いました。これらのコード行をコードに配置しました。

    $editFormAction = $_SERVER['PHP_SELF'];
    if (isset($_SERVER['QUERY_STRING'])) {
      $editFormAction .= "?" . htmlentities($_SERVER['QUERY_STRING']);
    }

ユーザーを別のページに送ってエントリを確認しようとしている場合、これは完全に混乱します。私はそれをコメントアウトし、$editFormAction を自分のページに設定し、それをヘッダー文字列とビオラで使用して、すぐに問題を修正しました。私が気付いていなかったのは、ページを更新しているときに $_POST 変数を空にしていて、Aaron が示唆する空のページで最終的にそのエラーを発見したことです。

これが他の誰かの役に立てば幸いです。dreamweaver のコードを二度と信用することはありません。私は手でコーディングすることを学びましたが、もっとよく知っているべきですが、急いでいたので、害はないと思いました。

すべての提案に感謝します。

4

7 に答える 7

4

session_start()関数を呼び出します。

session_start()

この呼び出しは、セッション データを利用する必要があるすべてのスクリプトで行う必要があります。たとえば、CAPTCHA 画像を作成するスクリプトがあり、セッションの合言葉を保存する必要がある場合は、スクリプトの先頭に session_start() を配置する必要があります。フォームへのユーザー入力を受け取り、ユーザーが入力した秘密の単語を以前に保存したものと照合する別のスクリプトがある場合は、そのスクリプトにも session_start() を配置する必要があります。

関数session_start() はパラメータを取りません。常にTRUEを返すため、わざわざ戻り値を確認する必要はありません。session_start() は HTTP Cookie ヘッダーを介して Cookie を設定するため、スクリプトから何かを出力する前に呼び出す必要があります。スクリプトの先頭で単純に呼び出すのが最善です。

セッションの終了

session_destroy()は、セッションに関連付けられたデータを破棄するために使用されます。ただし、これ自体ですべてがクリーンアップされるわけではありません。たとえば、セッション Cookie は設定解除されません。$_SESSION 配列は、スクリプトが終了するまで引き続き使用できます。

Cookie を削除するには、PHP で Cookie を削除するために使用する通常の方法を使用して手動で削除します。削除する Cookie の名前を取得するには、session_name() 関数を呼び出します。この関数は、PHP セッション ハンドラーによって設定された Cookie の名前でもある文字列を返します。

*セッション後にクリーンアップする方法のサンプル コードは、公式の PHP マニュアルに記載されています。

于 2013-08-26T05:18:54.067 に答える
3

あなたの 3 番目のページがどのように見えるかわかりませんが、私のものは次のようになります。

session_start(); // Use session variable on this page. This function must put on the top of page.

if( isset($_SESSION['i_am_in']) ) echo "logged in";

マイページ 2:

if ($login_ok) {
    session_start(); // Create session & settings
    $_SESSION['abc123'] = 'whatever';
    header('Location: page3.php');
}
于 2013-08-26T05:08:12.277 に答える
2

交換

if (!isset($_SESSION)) {
      session_start();
}

session_start();

$_SESSION超グローバルでいつでも利用できるからです。

また

$_SESSION特定のexをチェックしてみてください。$_SESSION['session']だけではなく$_SESSION

于 2013-08-26T05:05:37.537 に答える
1

10分前からまったく同じ問題があり、答えがありませんでした。別の可能な回答を提供します (あなたは問題を解決しましたが、他の人は解決していない可能性があります)。

セッションを開いfile1.phpてセッション変数を保存し、セッションをfile2.php開いてからその変数を取得しました$_SESSION。うまくいかず、 と から 2 つの異なるセッションも受けましfile1file2。その理由は、メモ帳++で再度保存したので保存されたfile1.phpためです。UTF-8 WITH BOMUTF-8 WITHOUT BOM

今、すべてが完全に機能します。思いもよらなかったこの問題に、きっと多くの人が陥ることでしょう。

于 2016-08-14T00:34:35.390 に答える
1
if(session_id() == ''){
    session_start();
}

$_SESSION は常に利用できるためです。

于 2013-08-26T05:08:24.430 に答える