【问题标题】:Losing first 2 session variables after calling a 3rd session variable (php 5)调用第三个会话变量(php 5)后丢失前 2 个会话变量
【发布时间】:2015-01-28 16:43:52
【问题描述】:

这是我的案例(在 php 上相对较新):我有一个页面“zoek_form.php”,您可以在其中输入 2 个表单中的搜索值(naam 和 categorie)。提交后,加载页面“zoek.php”并执行搜索(mysql 5.6)。为了执行搜索,从 2 个会话变量中获取 2 个值。到目前为止一切顺利,搜索工作正常并检索了行。 但现在我希望用户能够根据下拉列表在 zoek.php 中创建一个序列(通过 ORDER BY)。选定的值将存储在第三个会话变量中。但是现在问题是:选择序列并提交表单时,第一个2个会话值会丢失。我很困惑为什么。会话变量的本质只是存储值并能够一遍又一遍地使用它们? (直到它们被覆盖或杀死)。 当然我使用 session_start();在 php 脚本的开头(否则它根本不会起作用;-)。有什么想法吗?

这里是 zoek_form.php:

<html>
<head>
<title>Zoeken</title>
</head>
<body>

<?php session_start(); ?>
<form name="form1" method="POST" action="zoek.php">
<table border="0">
<tr><td>Naam product:</td>
<td><input type="text" size="50" name="form_naam"></td></tr>
<tr><td>Categorie:</td>
<td><input type="text" size="50" name="form_cat"></td></tr>
<tr><td></td>
<td align = "right"><input type="submit" name="B1" value="Zoeken">
</td></tr>
</table>
</form>

</body>
</html>

这里是 zoek.php:

<html>
<head>
<title>Zoeken</title>
</head>
<body>

<form name="form1" method="POST" action="">
<table border="0">
<tr><td>Sorteer op:</td>
<td><select name="form_sort">
  <option value="Naam">Naam</option>
  <option value="Categorie">Categorie</option>  
</select></td>
<td><input type="submit" name="B1" value="Sorteer"></td></tr>
</table>
</form>

<?php

session_start();
require_once 'test_connect.php';
$_SESSION['form_naam'] = $_POST['form_naam'];
$_SESSION['form_cat'] = $_POST['form_cat'];
$_SESSION['form_sort'] = $_POST['form_sort'];
// The 3 lines below were used to check whether session vars were set
// echo  $_SESSION['form_naam'];
// echo  $_SESSION['form_cat'];
// echo  $_SESSION['form_sort'];

function sorteren() {
global $sorteer;
$sorteer = $_SESSION['form_sort'];
  if ($sorteer == "Naam") {
  $sorteer = "ORDER BY naam";
  }
  else {
  $sorteer = "ORDER BY categorie";
  }
 }

// Put values from zoek_form.php in vars.
$naam = $_SESSION['form_naam'];
$cat = $_SESSION['form_cat'];

// Check if user has set a sequence. If yes: call function sorteren(),
// if no: leave var $sorteer empty.
if (isset($_SESSION['form_sort'])) {
sorteren();
}
else {
$sorteer = "";
}

// Get rows from table product
$sql = "SELECT * FROM product WHERE naam LIKE '$naam%' OR categorie
LIKE '$cat%' $sorteer";
$result = $conn -> query($sql);

if ($result->num_rows > 0) {
// here code to retrieve rows etc.    
}

// Give result free
$result -> free();

// Close connection
$conn -> close();

?>

</body>
</html>

【问题讨论】:

  • 像这样的排序和过滤功能与POST 请求不匹配 将数据存储在会话中也是一个坏主意,因为我们有浏览器选项卡并且用户可以打开多个过滤器。请改用GET。这种方式使您的问题无效。
  • 它可能无法解决您的问题,但我非常推荐使用 session_start;在文档的最顶部,在 html 标记之前。
  • 感谢 Halcyon 和 Christian 的反应。 @Halcyon:我现在正在使用 GET,但看不到没有会话的方法。使用会话它现在工作正常,我成功地完成了 FuzzyTree 的最后一个建议。 Christian,它确实没有解决这个特殊问题,但很高兴知道:-)

标签: php mysql session


【解决方案1】:

您在 zoek.php 中的表单不包含 form_naamform_cat 所以当您运行时

$_SESSION['form_naam'] = $_POST['form_naam'];
$_SESSION['form_cat'] = $_POST['form_cat'];

它将这些值设置为空。如果您想保留这些值,您可以尝试以隐藏输入字段的形式再次将它们传回

<input type="hidden" name="form_naam" value="<?= $_SESSION['form_naam'] ?>">
<input type="hidden" name="form_cat" value="<?= $_SESSION['form_cat'] ?>">

另一种防止覆盖会话值的方法是仅在设置了$_POST 值时才更改它们

if(isset($_POST['form_naam']) && isset($_POST['form_cat'])) {
  $_SESSION['form_naam'] = $_POST['form_naam'];
  $_SESSION['form_cat'] = $_POST['form_cat'];
}

【讨论】:

  • 感谢您回复 FuzzyTree。然而,仍然不解。因为只有在我尝试激活排序时才会出现问题。进行搜索时没有问题,值按原样存储在 form_naam 和 form_cat 中(因此 zoek.php 确实使用了 form_naam 和 form_cat)。但是这些不能第二次使用吗?还是我忽略了某些东西,或者我不明白会话在 php 中是如何工作的?谢谢!
  • @Ray44 第二次发布表单时,您将使用空值覆盖会话值,因为 $_POST['form_naam']$_POST['form_cat'] 未在您的第二个表单中定义。
  • FuzzyTree,非常感谢您对使用 isset 函数的建议。这让我走上了正确的道路并成功了!现在工作得很好!我很高兴:-))
猜你喜欢
  • 2011-12-05
  • 2023-01-23
  • 2011-04-15
  • 2014-08-14
  • 1970-01-01
  • 2011-11-06
  • 2011-03-09
相关资源
最近更新 更多