我已经查看了有关会话变量未保存的所有问题,并且没有看到我的问题所以我会问它。
我有一个表单,一旦提交,它会在我的数据库中搜索该名称。初始表格在第1页。 在第2页,我从第1页获取变量并将其保存为
$searchTerm = $_POST['find'];
用作搜索数据库,效果很好。在那之下,我有我的sql语句然后我放置了这个
//initialize the session
if (!isset($_SESSION)) {
session_start();
}
$_SESSION['searchTerm'] = $searchTerm;
然后我在第2页测试了$ _SESSION ['searchTerm'],以确保它正确保存,确实如此。我的问题出现在我尝试转到第3页,它是第2页表单的确认页面。我在第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.
的 的 ** * ** * ** * 的** 编辑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的代码。我学会了手工编写,应该知道的更好,但我很着急,并认为哦,它不会伤害它。
再次感谢您的所有建议。
答案 0 :(得分: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');
}
答案 1 :(得分: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
答案 2 :(得分:3)
调用 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手册中找到会话后如何清理的示例代码。
答案 3 :(得分:0)
<强>替换强>
if (!isset($_SESSION)) {
session_start();
}
<强>与强>
session_start();
因为$_SESSION
是超全局的并且始终可用。
或强>
尝试检查特定的$_SESSION
例如。 $_SESSION['session']
而不只是$_SESSION
。
答案 4 :(得分:0)
if(session_id() == ''){
session_start();
}
因为$ _SESSION始终可用。
答案 5 :(得分:0)
session_start()
这应该是在脚本的顶部。没有if
语句来确定是否启动它。
第2页
在第二个脚本中,在header(sprintf("Location: %s", $insertGoTo));
之前,您有session_start()
。如果标题位置发生变化,您的会话将永远不会开始。
将session_start()
置于顶部。不要用if语句包围它。
第3页
同时将session_start()
放在第三页的顶部,不带任何if语句。您不了解会话使用情况。它不像常规功能。您必须首先在要使用它的每个页面上启动会话。在致电session_start()
之前,您无法检查$ _SESSION变量的内容。
告诉我你什么时候做的以及结果是什么。
答案 6 :(得分:0)
自10分钟前我就遇到了同样的问题,没有回答对我有帮助。我给你另一个可能的答案(你解决了你的问题,但其他人可能没有)。
我file1.php
打开会话并保存会话变量,file2.php
打开会话并从$_SESSION
检索该变量。它没有用,我还有file1
和file2
两个不同的会话。原因是file1.php
保存为UTF-8 WITH BOM
我用Notepad ++再次保存为UTF-8 WITHOUT BOM
。
现在一切都很完美。我相信很多人都会陷入这个我甚至想不到的问题。