2015-11-03 32 views
0

我正在为MySql DB开发自定义CRUD。 (请原谅我的英语)未正确存储导航历史记录和会话信息中未记录的脚本访问

注:其没有被正确拷贝编辑的脚本(其中一个是第一位的dupplicate ..

我试图阻止Backspace键导航插入,更新和删除脚本,因为那些可以产生insconsitent数据库条目

CRUD产生列表,插入,查看,更新和删除脚本和附加信息insert_DB,update_DB和delete_DB脚本,它们携带适当的DB函数或提醒用户对脚本的回拨函数并将其重定向到主页。

为了防止这些页面的双重执行,插入,更新和删除页面会记录一个会话变量$ _SESSION ['Process'],其中包含要执行的下一个进程。

DB脚本检查适当的$ _SESSION ['Process']值并继续执行DB操作。如果成功,则将浏览器重定向到特定表的列表页面。

继续前进,这工作正常。但是,在用户被重定向到List List脚本之后,如果用户点击“backspace”,则用户不会被重定向到DB脚本(这会默默地失败并提醒用户),而是会被调用insert,view或update脚本,滑动数据库脚本。数据库脚本不记录在浏览器历史记录中。此外,初始的List脚本不显示正确的会话值。

例如: (这些实施例不限于示出预期的功能,并且不覆盖最好pratices,也不DB连接,等等)

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或上传延迟。

我试图无济于事,几个aproaches以保证会议书面方式和HTML刷新,如:

session_write_close(); 
sleep(10); 
<meta HTTP-EQUIV="Pragma" CONTENT="no-cache"> 
<body onLoad="document.location.reload();"> 

在此先感谢

+0

您可以检查后的数据,同时查询。前者为 。如果(isset($ _ POST)){ 做你的SQL查询。 } – kevin

+0

非常感谢Kevin,我可能会采取你推荐的方法,但我真的很想知道我在做什么我的方法错了。前段时间我有类似的问题,我忘记了解决方案。 – Abhik

回答

0

事实的组合使代码无法工作......

+)我期待一个ListDBTest.php被记录在浏览器历史记录中,其中ListDBTest.php基本上是一个服务器端脚本,所以没有向浏览器发送报头只是一个警报,因此浏览器没有“访问页”...

+)回到页面,根据运行的浏览器生成可变结果,并且很难让页面在所有浏览器上都100%清洁。

正确回答我的问题,是要实现一个PGR(后获取重定向)模式。 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/