php初学者问题(表单提交,后按刷新)

wuhaiping 2008-03-27 04:42:25
开始学习PHP时设置了register_globals=on,则可以用$ID直接得到他的值了,
现在php设置了register_globals=off,则用了$_REQUEST[ID]得到其的值.
但这出现一个问题,当我保存数据时,数据库中的ID会自动加1保存,,保存后如果我按浏览器的刷新按钮,他就会不继续我的保存功能,使ID不断加一,保存到数据库中,对这咱问题我该如果解决.

我帖点我的代码,希望大家能帮我看看.


/***********************************************************
数据库那块我封装了
还有一个问题,ATTATCH:<input type="file" name="wattatch" id="wattatch" >
这个上传附件,为何他在数据库中出现的目录和在我设置的目录不一样,数据库中常出现APPACHE下面的什么TEMP目录下一个XXX.tmp.这个XXX也和我上传的文件不一样.我在我设置的目录下能看到我上传的文件.
**********************************************************/
$add=$_POST[add];
$wname=$_POST[wname];
$wgendar=$_POST[wgendar];
$woldyear=$_POST[woldyear];
$wmem=$_POST[wmem];
//if(!isset($_POST[wattatch]))也因为提交的原因,这句话也不好用.
$wattatch=$_POST[wattatch];


if($add=="add"){
$maxID=get_Max_ID();
echo "max:".$maxID;
if(!is_dir("wtest")){
mkdir("wtest");
}
if(move_uploaded_file($_FILES["wattatch"]["tmp_name"], "./wtest/".$_FILES["wattatch"]["name"])){
echo "seccess!";
}else{
echo "error!";
}
$dbh = new DB_Oracle ();
$sql = "
INSERT INTO A_TEST
(
id,name,gendar,oldyear,mem,attatch
)
VALUES(
$maxID,
:wname,
:wgendar,
:woldyear,
:wmem,
:wattatch
)
";
$stmt = $dbh->prepare ( $sql ) ;
$param = array ( ":wname" => $wname,
":wgendar"=> $wgendar,
":woldyear"=> $woldyear,
":wmem"=> $wmem,
":wattatch"=> $wattatch
) ;
$stmt->execute ($param) ;
$sql1 = " select * from A_TEST WHERE ID = :wid";
$stmt = $dbh->prepare ( $sql1 );
$param = array (":wid" =>$maxID) ;
$stmt->execute($param);
$result = $stmt->fetch();
$stmt->finish();
}


<form name="form1" id="form1" action="wu_test.php" method="post" enctype="multipart/form-data" >
ID:<input type="text" name="wid" id="wid" value="<?php echo $result["ID"];?>"><br>
NAME:<input type="text" name="wname" id="wname" value="<?php echo $result["NAME"];?>"><br>
GENDAR:<input type="text" name="wgendar" id="wgendar" value="<?php echo $result["GENDAR"];?>"><br>
OLDYEAR:<input type="text" name="woldyear" id="woldyear" value="<?php echo $result["OLDYEAR"];?>"><br>
MEM:<input type="text" name="wmem" id="wmem" value="<?php echo $result["MEM"];?>"><br>
ATTATCH:<input type="file" name="wattatch" id="wattatch" value="<?php echo $result["ATTATCH"];?>">
<input type="submit" id="find" name="find" value="find">
<input type="submit" id="add" name="add" value="add" onClick="beforeSave();">
</form>

...全文
301 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
wuhaiping 2008-03-31
  • 打赏
  • 举报
回复
楼上的那个没用,我加了他还是加1保存。
echo ("<script language='javascript'> Location.href='wu_test.php'; </script>");
ten789 2008-03-31
  • 打赏
  • 举报
回复
忘了最重要的东西了

b.php
<?php
if($_POST['input'] != $_SESSION['input']){
echo '非法提交'; //这里应该是你的异常处理方式
exit();
}
$_SESSION['input'] = '';
... ...
?>
ten789 2008-03-31
  • 打赏
  • 举报
回复
表单不仅仅是客户端表现问题 安全性上也要防止表单重复提交

a.php
<?php
$data = microtime(true);
$_SESSION['input'] = $data;
?>
<from action="b.php" method="post">
<input type="text" name="name"/>
<input type="hidden" name="input" value="<?php echo $data;?>" />
</from>

b.php
<?php
if($_POST['input'] != $_SESSION['input']){
echo '非法提交'; //这里应该是你的异常处理方式
exit();
}
... ...
?>
总哈哈 2008-03-31
  • 打赏
  • 举报
回复
说白了就是判断POST是不是空的,在处理完以后跳转一下页面就可以了。
wuhaiping 2008-03-31
  • 打赏
  • 举报
回复
多谢各位,确实只要多加一句header ( 'location: ./wu_test.php');或楼主给的echo (" <script language='javascript'> location.href='wu_test.php'; </script>");

但又来一个问题,我加了一条记录后,还要显示。我加了那句话后,直接跳转到最开始没数据的页面了。也就是没有我刚加的数据的那条记录显示在页面上。
ichigoxi 2008-03-31
  • 打赏
  • 举报
回复
貌似是小写的l........
echo "<script>location.href=\"index.php\";</script>";
ten789 2008-03-29
  • 打赏
  • 举报
回复
很经典的问题 重复提交

可以给表单一个类似验证码的字符串 同时把这个字符串写道SESSION中
在接收表单后比对验证码和SESSION是否一致 一致认为有效提交并改写SESSION中验证码字符串
snlixing 2008-03-29
  • 打赏
  • 举报
回复
提交后,跳转到另一页
striker_un 2008-03-29
  • 打赏
  • 举报
回复
还有一点个人建议就是,最好将这两个页面分开.
表单页面简单的做表单.
提交页面就做提交的事.
striker_un 2008-03-29
  • 打赏
  • 举报
回复
介绍一个不错的函数,我再开发时常用.
extract($_POST);

这样就相当于打开了register_globals=on.

当我保存数据时,数据库中的ID会自动加1保存,,保存后如果我按浏览器的刷新按钮,他就会不继续我的保存功能,使ID不断加一,保存到数据库中,对这咱问题我该如果解决.
你可以设置一个cookie ,再限制提交时间. 挡在执行sql 前面验证一道,如果是短期内刷新,则另外处理掉.
ningbochen 2008-03-29
  • 打赏
  • 举报
回复
$stmt->finish();
这句后面加:
echo '<script>Location.href=\"test.php\"</script>';
wuhaiping 2008-03-29
  • 打赏
  • 举报
回复
各位有空请帮我去看看这个问题。是js 方面的,父子两窗口参数传来传去的问题。就是父窗口传到子窗口,由子窗口提交到后台去处理,也就是php处理,然后把处理结果传回来,其中,子页面是隐藏的,不能对他进行操作。http://topic.csdn.net/u/20080329/15/cb84559c-2e73-4b99-b68a-cba82bb5b0f1.html
wuhaiping 2008-03-29
  • 打赏
  • 举报
回复
还有忘了11楼,你的方法对我来说是个挑战,找时间学习。
wuhaiping 2008-03-29
  • 打赏
  • 举报
回复
谢谢楼上各位,
一楼的方法我还没试,有点难度,我找个时间慢慢来搞,

三楼的你的方法,我试了一下,好像不行,刷新时还自动加1。

四楼的你提跳转,我试了一下,不会用,我改天花功夫研究一下,你的第二种方法,我不知是不是我没看懂,因为我做的是自动加1,所以是数据库中肯定是没数据的。

12楼的我觉得你那个cookie是个偷懒的方法,不足取,要是有人加了一记录,走开一会儿,再跑来刷新一下,怎么办。你下面的那条见意非常好。说句丢人的话,我到今天业务和逻辑都没完全搞明白。我会努力学习的。

如果那位有空能帮我用看一下那个跳转语句应该加那儿,怎么加。(不好意思,偷懒了)
hy_lihuan 2008-03-28
  • 打赏
  • 举报
回复
其实你这样的问题就是没有跳转造成的,保存修改都会产生这样的问题,所以建议你跳转
gs6fox 2008-03-28
  • 打赏
  • 举报
回复
楼上所言甚是
huizi103 2008-03-28
  • 打赏
  • 举报
回复
成功插入后跳转回来,这是刚学php时经常遇到的问题。。。。
LTAAA 2008-03-27
  • 打赏
  • 举报
回复
呵呵,这个问题其实是逻辑问题,解决方法有两个:
1: 在添加之后跳转回原页面:header("LOCATION:XXXXX");
2: 在数据库添加时判断该数据存在与否。
LTAAA 2008-03-27
  • 打赏
  • 举报
回复
呵呵,这个问题其实是逻辑问题,解决方法有两个:
1: 在添加之后跳转回原页面:header("LOCATION:XXXXX");
2: 在数据库添加时判断该数据存在与否。
LTAAA 2008-03-27
  • 打赏
  • 举报
回复
呵呵,这个问题其实是逻辑问题,解决方法有两个:
1: 在添加之后跳转回原页面:header("LOCATION:XXXXX");
2: 在数据库添加时判断该数据存在与否。
加载更多回复(4)

21,886

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧