更新完成后,会话未被销毁

时间:2018-01-11 18:02:08

标签: php session

我有一个使用会话的页面,在此页面上我希望能够更新字段中的文本,然后使用该文本更新数据库。这一切都很好,但是在更新完成后会话没有被破坏所以当我回到显示页面时,如果我尝试点击另一个条目,我会得到上一个会话的结果。例如,我单击一个按钮来更新pId为3的项目并更新pDesc,pId 3正确更新。现在我想更新第4页,我仍然在各个方框中填写了第3页信息,而且没有来自第4页的信息。有关如何使其工作的任何建议吗?

这是显示项目列表的BEdisplay(我没有包含所有代码):

session_start();

try {
//SQL SELECT statement
$result = $conn->prepare("SELECT * FROM projecttable");
$result->execute();
// assign returned array elements to variables
$rows = $result->fetchAll(PDO::FETCH_ASSOC);
} catch (PDOException $e) {
echo "Table Retrieval Failed: " . $e->getMessage();
}
?>

<!DOCTYPE html>
<html>
<head>
<meta charset="ISO-8859-1">
<title>Back End Insert</title>
<link rel="stylesheet" type="text/css" href="form.css">
</head>
<body>
<br>
<h1>Project Dashboard</h1>
<form action="index.php">
<button class="buttonAdd" type="submit" name="add">Add Project</button>
</form>

<?php
foreach ($rows as $row) {
    $pId = $row['pId'];
    $pName = $row['pName'];
    $pDesc = $row['pDesc'];
    $dDate = $row['dDate'];

    $_SESSION['pId'] = $pId;
    $_SESSION['pName'] = $pName;
    $_SESSION['pDesc'] = $pDesc;
    $_SESSION['dDate'] = $dDate;
    ?>

这是process.php,它使用switch case来确定要采取的操作:

switch ($action) {

case 'delete' :
    echo $pId;
    $sql = "DELETE FROM projecttable WHERE pId  = '$pId'";
    $conn->exec($sql);
    header("Location: BEdisplay.php");
    break;

case 'update' :
    header("Location: update.php");
    break;
}

以下是我从update.php获取会话信息的地方:

session_start();
$pId = $_SESSION['pId'];
$pName = $_SESSION['pName'];
$pDesc = $_SESSION['pDesc'];
$dDate = $_SESSION['dDate'];
session_unset();
session_destroy();

当按下更新按钮时,我们转到updateSQL.php,然后运行更新,然后返回BEdisplay.php。

1 个答案:

答案 0 :(得分:1)

您需要在BEdisplay.php文件中使用相同的代码来取消/销毁会话,就像您对update.php文件所做的那样。这就是为什么它不会被玷污/破坏。

注意:我必须声明您的代码对sql注入是开放的,使用预准备语句。

检查PHP和查询的错误(以防万一):

并使用var_dump(); https://php.net/manual/en/function.var-dump.php