我在按下"addrecord"按钮时检测到表单提交,然后在$_POST数组中重置"addrecod"按钮的值:
if(array_key_exists('addrecord', $_POST))
{
var_dump($_POST);
if($_POST['addrecord'] == "ADD RECORD")
{
$_POST['addrecord'] = "Handled already."; // prevents a 'reload'
// from adding the same record again
// now do the 'addrecord' -- just once -- to the database
}
else
{
// yay -- we avoided adding the same record on a browser reload
}
}
问题是,当我在Firefox 8中单击"重新加载"按钮时,上面的var_dump显示了我--post数组的"addrecord"值不是字符串"Handled already"--它仍然是"ADD RECORD"。
当用户单击"addrecord"按钮时,服务器会得到一个POST数组,addrecord按钮的值为"添加记录"--这是我表单上的添加记录按钮:
<input type="submit" name="addrecord" value="ADD RECORD" />
然后在服务器端,我看到"addrecord"的值是"ADD RECORD",并更改POST数组的"addrecod"元素从"添加记录"到"已处理"
然后服务器向浏览器发送一个新页面,上面写着"添加记录!"
因此,"addrecord"元素的POST数组值似乎不再是"ADD RECORD",因为我将其更改为"Handled already"。如果用户没有再次按下表单上的"添加记录"按钮,而是只重新加载页面——那么浏览器如何将POST数组从"已处理"重新设置为"添加记录(add record)"?为什么当服务器接收到页面重载时,POST数组的"addrecord"元素会丢失我之前设置的值,"已处理。"?
因为当我在浏览器上单击"reload"时,var_dump会告诉我——这正是发生的事情:POST数组的"addrecord"值现在正好回到"ADD RECORD"——尽管用户没有单击表单的添加记录按钮。
为什么?浏览器是否以某种方式拥有用于填充服务器上POST数组的值的缓存副本,这样即使您在服务器上的php中更改POST数组,浏览器也会重新提交所有旧表单值的缓存拷贝?
是的,浏览器会记住POST数据,并且缓存的信息不受表单中处理PHP代码的任何内容的影响。如果用户点击重新加载,将再次发送相同的POST数据。
防止重载再次插入相同数据的另一种方法是在数据库列中包含"提交标识符"列。当您为用户显示要填写的表单时,请包含一个具有唯一标识符的隐藏表单字段——请参阅PHP的uniqid()或microtime()函数。然后你可以:
a) 在发送INSERT命令之前查询数据库,查看是否已经提交了具有该提交ID的表单,或者
b) 只需向数据库表中的新列添加一个UNIQUE索引,就不会创建重复的记录。
在PHP中设置$_POST时,您只需覆盖PHP看到的内容,而不是FF发送的内容!Firefox永远不会收到您更改POST参数的通知。
在更高的层面上,我认为你正在努力实现的目标在这里已经得到了非常频繁和精心的回答。GIYF。