我有一个使用会话的页面,在此页面上我希望能够更新字段中的文本,然后使用该文本更新数据库。这一切都很好,但是在更新完成后会话没有被破坏所以当我回到显示页面时,如果我尝试点击另一个条目,我会得到上一个会话的结果。例如,我单击一个按钮来更新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。
答案 0 :(得分:1)
您需要在BEdisplay.php文件中使用相同的代码来取消/销毁会话,就像您对update.php文件所做的那样。这就是为什么它不会被玷污/破坏。
注意:我必须声明您的代码对sql注入是开放的,使用预准备语句。
检查PHP和查询的错误(以防万一):
并使用var_dump();
https://php.net/manual/en/function.var-dump.php