我正在为MySql DB开发一个自定义CRUD。 (请原谅我的英文)
注意:编辑过的脚本没有被正确复制(一个是第一个的重复...
我正在尝试阻止Backspace导航插入,更新和删除脚本,因为这些脚本可以生成insconsitent数据库条目。
CRUD生成列表,插入,查看,更新和删除脚本以及附加的insert_DB,update_DB和delete_DB脚本,这些脚本带有相应的数据库功能,或者会提醒用户非法调用脚本并将其重定向到主页。
为了防止这些页面的双重执行,插入,更新和删除页面记录了一个会话变量$ _SESSION ['Process'],其中包含要执行的预期下一个进程。
DB脚本检查适当的$ _SESSION ['Process']值并继续执行DB操作。如果成功,则会将浏览器重定向到特定表的List页面。
前进这个工作正常。但是在用户被重定向到表List脚本之后,如果用户点击“退格”,则用户不会被重定向到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();
}
&GT;
如果让这些脚本按预期工作,我该怎么办?
我在这个问题上搜索了StackOverflow和Google搜索没有任何有用的建议,一些导致使用计时器和延迟,但提到了AJAX或上传延迟。
我试图无济于事,有几个方法可以保证会话写作和HTML刷新,如:
session_write_close();
sleep(10);
<meta HTTP-EQUIV="Pragma" CONTENT="no-cache">
<body onLoad="document.location.reload();">
提前致谢
答案 0 :(得分:0)
事实的组合使代码无法运行......
+)我期待一个ListDBTest.php被记录在浏览器历史记录中,其中ListDBTest.php基本上是一个服务器端脚本,所以没有标题发送到浏览器只是一个警报,因此浏览器没有&#34;访问页面&#34; ...
+)导航回页面,根据运行的浏览器产生了可变的结果,并且很难在所有浏览器上将页面重置为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模式解决了大多数重复记录问题,但仍然是非常好的做法,包括一个&#34; nonce&#34;如第一条所述,您的请求字段。
在服务器响应或互联网响应缓慢的情况下,您可能希望使用&#34;提交按钮&#34;在制作&#34; Post&#34;后禁用,因此用户无法在第一个实例中两次发送表单。看一下这个:http://www.the-art-of-web.com/javascript/doublesubmit/