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 上找到了一个脚本来测试服务器是否可能导致问题。该脚本工作正常,没有问题,表明服务器不是问题。但是,当我将第二页和第三页上传到服务器并放入时

    <?php echo session_id(); ?>

第 2 页和第 3 页的数字完全不同,因此使我的变量为空。我做了进一步的研究,并认为这可能是因为有一个 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.

** * ** * ** * **编辑 2 和我的修复* ** * ** * ** *

所以在与你们中的一些人进行了一些交流之后,Aaron Gong 建议我从空白页开始,然后从那里开始。我这样做了,终于诊断出这个问题。这是我没有想到我应该拥有的东西。我不喜欢使用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()

这个调用应该在每个需要使用会话数据的脚本中。例如,如果您有一个创建验证码图像的脚本并需要存储会话的密码,则需要将 session_start() 放在脚本的开头。如果您有另一个脚本接受用户输入表单并检查用户输入的密码与您之前存储的内容,您还需要将 session_start() 放入该脚本中。

函数session_start() 没有参数。它总是返回TRUE,因此您不必费心检查它的返回值。由于 session_start() 通过 HTTP cookie 标头设置 cookie,因此您必须在从 script 输出任何内容之前调用它。最好在脚本的开头简单地调用它。

结束会话

session_destroy()用于销毁与会话关联的数据。但是,这本身并不能清理所有内容。例如,会话 cookie 未设置。在脚本结束之前,$_SESSION 数组仍然可用。

要删除 cookie,请使用在 PHP 中删除 cookie 的常用方法手动删除它。要获取要删除的 cookie 的名称,请调用 session_name() 函数,该函数返回一个字符串,该字符串也是 PHP 会话处理程序设置的 cookie 的名称。

*有关如何在会话后进行清理的示例代码可以在官方 PHP 手册中找到。

于 2013-08-26T05:18:54.067 回答
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 回答
3

第1页很好,第2页和第3页应该是这样的

第2页

//initialize the session and set are $_SESSION variable from the form data
session_start();
$_SESSION['searchTerm'] = $_POST['find'];

//set where condition and check if $_POST['find'] has a value
$whereclause = "";
if(isset($_POST['find'])) {
    $whereclause = "WHERE mytable.lastName = '".$_POST['find']."'";
}

/*execute your statement note: data passed such as $_GET, $_POST, $_SESSION should never 
be directly in your statement, use PDO to prepare and execute your statements to prevent 
SQL injection*/

//then if you wanted to be redirected to page 3 use header after your statement has executed

header('Location:comfirmPage3.php');

第 3 页

//initialize the session so we can access our $_SESSION variables
session_start(); 

//set where condition and check is $_SESSION['searchTerm'] has a value
$whereclause = "";
if(isset($_SESSION['searchTerm'])) {
    $whereclause = "WHERE myTable.lastName = '".$_SESSION['searchTerm'] ."'";
}
//execute your statement
于 2013-08-26T05:13:41.310 回答
2

代替

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

session_start();

因为$_SESSION它是超级全球性的并且它总是可用的。

或者

尝试检查特定的$_SESSION前任。$_SESSION['session']而不仅仅是一个$_SESSION.

于 2013-08-26T05:05:37.537 回答
1
if(session_id() == ''){
    session_start();
}

因为 $_SESSION 始终可用。

于 2013-08-26T05:08:24.430 回答
1

自 10 分钟前以来,我遇到了同样的问题,但没有任何答案对我有帮助。我给你另一个可能的答案(你解决了你的问题,但其他人可能没有)。

file1.php打开了一个会话并保存了一个会话变量,file2.php打开了会话并从$_SESSION. 它没有用,我也有两个不同的会话来自file1file2。原因是它file1.php被保存为UTF-8 WITH BOM我用 Notepad++ 再次保存为UTF-8 WITHOUT BOM.

现在一切正常。我敢肯定,很多人会陷入我什至无法想到的问题。

于 2016-08-14T00:34:35.390 回答
0

session_start()

那应该就在脚本的顶部。没有if声明来确定是否启动它。

第2 页 在第二个脚本中,您header(sprintf("Location: %s", $insertGoTo));在拥有session_start(). 如果标题位置更改,您的会话将永远不会开始。

放在session_start()最上面。不要用 if 语句包围它。

PAGE 3 也放在session_start()第三页的顶部,没有任何 if 语句。您不了解会话使用情况。它不像常规功能。您必须首先在要使用的每个页面上启动会话。您不能在调用之前检查 $_SESSION 变量的内容session_start()

让我知道你什么时候这样做了,结果如何。

于 2013-08-26T06:02:34.790 回答