脚本访问未记录在导航历史记录中,会话信息未正确存储
Script visit not recorded in navigation history and session info not correctly stored
我正在为MySql DB开发一个自定义CRUD。(请原谅我的英语)
注意:未正确复制的已编辑脚本(其中一个是第一个的重复副本。
我试图阻止Backspace导航插入、更新和删除脚本,因为这些脚本可能会产生不一致的DB条目。
CRUD生成列表、插入、查看、更新和删除脚本,以及附加的insert_DB、update_DB和delete_DB脚本,这些脚本携带适当的DB函数,或者会提醒用户对脚本的特权调用并将其重定向到主页。
为了防止这些页面的双重执行,插入、更新和删除页面会记录会话变量$_session["进程"]以及要执行的下一个进程。
DB脚本检查适当的$_SESSION['Process']值,然后继续执行DB操作。如果成功,将把浏览器重定向到特定表的"列表"页。
展望未来,这很好。但是,在用户被重定向到表列表脚本后,如果用户点击"退格",则用户不会被重定向到DB脚本(这将自动失败并提醒用户),而是被重定向到调用插入、查看或更新脚本,从而跳过DB脚本。DB脚本未记录在浏览器历史记录中。此外,初始List脚本没有显示正确的会话值。
例如:(示例仅限于显示预期功能,不包括最佳实践,也不包括数据库连接等。)
ListTest.php
<?php
session_start();
$_SESSION['DBName'] = "segucom_Responsive";
echo"Request DB Data collection form <br />";
echo "Session(Insert) as Received: ", print_r($_SESSION), "<br/>";
$_SESSION [ 'Process' ] = "";
session_write_close();
echo "Session(Insert) as Set: ", print_r($_SESSION), "<br/>";
?>
<form method="post" name="InsertCheck" action="ListFormTest.php" >
<p><input type="hidden" name="ListRequest" value="1" ></p>
<input type="submit" value="submit" />
</form>
ListFormTest.php
<?php
session_start();
echo"Collect data and sent to DB Insert script <br />";
echo "Session(Insert) as Received: ", print_r($_SESSION), "<br/>";
$_SESSION [ 'Process' ] = "Insert";
session_write_close();
echo "Session(Insert) as Set: ", print_r($_SESSION), "<br/>";
?>
<form action="ListDBTest.php" method="post" name="InsertCheck" >
<p>Input Some data <input type="text" name="Data" ></p>
<input type="submit" value="submit" />
</form>
ListDBTest.php
<?php
session_start();
echo"Receive data and insert in to DB, Chek for Scorrect Session Process value <br />";
echo "Session(Insert) as Received: ", print_r($_SESSION), "<br/>";
if ($_SESSION[ 'Process' ] != "Insert") {
$_SESSION [ 'Process' ] = "Ilegal";
session_write_close();
echo "Session(Insert) as Set: ", print_r($_SESSION), "<br/>";
echo '<script type="text/javascript"> alert ("ILEGAL FORM ACCESS,");
window.location="ListTest.php";</script>';
}
$_SESSION [ 'Process' ] = "Legal";
echo "Session(Insert) as Set", print_r($_SESSION), "<br/>";
include "../../cgh/tcl.txt";
$conn = connect();
$sql = "INSERT INTO Test (`Data`) VALUES ('" . $_POST[ 'Data' ] . "');";
$res = $conn->query($sql) or die("Could not write Record, $sql " . print_r($conn->errorInfo()));
if ($res != FALSE ) {
$_SESSION[ 'Process' ] = "Processed";
/*sleep(10);*/
session_write_close();
echo "Session(Insert) as Set: ", print_r($_SESSION), "<br/>";
echo '<script type="text/javascript"> alert ("Record Inserted");
window.location= "ListTest.php"; </script>';
} else {
$_SESSION [ 'Process' ] = "DB_Error";
/*sleep(10);*/
session_write_close();
echo "Session(Insert) as Set: ", print_r($_SESSION), "<br/>";
echo '<script type="text/javascript"> alert ("Record Not Inserted");
window.location= "ListTest.php";
</script>';
die();
}
?>
我该怎么做才能使这些脚本按预期工作?
我搜索了StackOverflow并在谷歌上搜索了这个问题,但没有得到任何有用的建议,有些建议导致了定时器和延迟的使用,但提到了AJAX或上传延迟。
我试过了,但没有成功,有几个建议可以保证Session Writing和HTML Refresh,比如:
session_write_close();
sleep(10);
<meta HTTP-EQUIV="Pragma" CONTENT="no-cache">
<body onLoad="document.location.reload();">
提前感谢
事实的结合使代码无法操作。。。
+)我希望在浏览器历史记录中记录一个ListDBTest.php,其中ListDBTestphp基本上是一个服务器端脚本,所以没有发送到浏览器的标题,只是一个警报,因此浏览器不会"访问页面"。。。
+)导航回页面会根据运行的浏览器产生不同的结果,而且很难在所有浏览器上100%清除页面。
我的问题的正确答案是实现PGR(Post-Get-Redirect)模式。https://en.wikipedia.org/wiki/Post/Redirect/Get乍一看,这并不容易理解,但示例如下:
http://solidlystated.com/design/best-way-to-process-forms-with-php/和http://phptutorial.codepoint.net/php_redirection会让你走一半以上的路。
在这里,需要注意的是,尽管PGR模式解决了大多数复制记录问题,但如第一篇文章中所述,在请求中包含"nonce"字段仍然是非常好的做法。
在服务器响应或互联网响应缓慢的情况下,您可能希望在"发布"后禁用"提交按钮",这样用户就不能在第一次发送两次表单。看看这个:http://www.the-art-of-web.com/javascript/doublesubmit/
- 访问布局信息是否也会导致浏览器重排
- 使用Dnamics CRM 2011中的JavaScript读取子网格的所有记录,而不考虑活动页面
- 定义完全独立的样式信息
- 使用html2canvas获取基本信息
- JS表单提交"无法使用Chrome数据保护程序加载此页面.尝试重新加载页面.调试信息:POST CISmtuK
- DataTable没有显示分页按钮和记录信息-JQuery
- 如何在调用AJAX时记录或捕获信息和错误
- 通过单击“MVC 获取错误”中的“下一步”按钮 asp.net 在同一详细信息页面上显示记录
- 如何安全地记录用户统计信息
- 如何在用户脚本中不使用警报来记录信息
- 解析中未记录信息
- 脚本访问未记录在导航历史记录中,会话信息未正确存储
- 我尝试使用R Shiny部署一个应用程序,但网页立即退出,并说诊断信息已记录到我的JavaScript控制台
- 如何使文本框自动完成结果选择直接导航到记录详细信息
- 在Javascript中直接获取Lotus Notes中的视图信息/记录
- 多维数组-用于获取记录信息的javascript while循环
- nodecron与nodeschedule在创建heroku服务器以记录统计信息时的比较
- 如何在mvc 4中显示任何选定记录的详细信息
- 用于永久记录信息的包
- 如何使SharePoint中的按钮显示有关记录的信息?