我有一段代码如下:<?php
class submitFunc{
 static $a;
 function submitFunc(){
 }
 function testFunc(){
  $this->a++;
  echo "\n  a = ".$this->a;
 }
}
extract($_POST);
extract($_GET);if ($act == "subok"){
 $monitor = new submitFunc();
 $monitor->testFunc();
 $monitor->testFunc();
 $monitor->testFunc();
}
?>
<form name="form1" method="post" action="?act=subok">
<input type="submit" value="提交">
</form>
================ 当我第一次点击“提交”按钮以后出现:
a = 1 a = 2 a = 3
可我第二次点击“提交”按钮以后还是出现:
a = 1 a = 2 a = 3我希望的效果是:
当我第一次点击“提交”按钮以后出现:
a = 1 a = 2 a = 3
第二次点击“提交”按钮以后出现:
a = 4 a = 5 a = 6

解决方案 »

  1.   

    每次提交是一个新的请求,你的程序会从头执行,和上次提交没关系
    你想要的效果是在一次请求里面多次执行到这个地方如有a.php
    <?phpfoo();
    //foo();
    //foo();function foo() {
    static $a; $a++;
    echo $a;
    }
    ?>
    你每次访问a.php都只会输出1
    若把两个注释去掉,那么每次访问都会输出123,这是static的用法你应该通过其它方式记录,比如cookie session 或者共享内存
      

  2.   

    可是我提交的东西是一篇文章很大啊!没办法在cookie里面做吧?
      

  3.   

    你可以研究研究cookie session能存多少东西
    如果你确实希望能一步一步提交,最后一次再保存所有的东西,可以考虑下列方法将前一步所得到的内容做成hidden放在这一步的页面上
    在数据库使用临时表记录每一步的内容
    使用共享内存记录每一步的内容>我在想是不是有一种类,可以在窗体关闭以前都有效的呢?
    我个人没有听说过这样的类,但是cookie 和 session都可以通过某种设置达到类似的目的
      

  4.   

    >将前一步所得到的内容做成hidden放在这一步的页面上
    >在数据库使用临时表记录每一步的内容
    >使用共享内存记录每一步的内容php可以使用共享内存吗?我去查一下,呵呵
      

  5.   

    php是解释性的语言,一个页面执行完了,什么都销毁了,不像.net那样还有什么全局的东西,所以还是想办法存在cookie或session或数据库或文件中吧
      

  6.   

    这和语言没关系,http是无状态的协议. 
    将前一步所得到的内容,加密或者序列化,做成hidden放在这一步的页面上.net就是这么做的.
    或者将前一步的内容保存进数据库里面.
      

  7.   

    可以用memcache扩展实现共享内存
      

  8.   

    LZ,其实你犯了一个很微妙的错误,你是想通过静态字段达到一个操作保存的效果,但是非静态方法怎么能够调用静态字段呢?调用静态字段需要在静态方法里通过“类名::$变量名”调用,看了你的设计需求,我自己试了一下,代码如下:(oop.php,因为我懒得在action里写提交到本PHP里,所以楼主还是要把action里的跳转与文件名改成一致才能访问)
    <?php
    class submitFunc{ static $a;
     
     function submitFunc(){ } static function testFunc(){ if(!$_GET['a'==""]){ submitFunc::$a = $_GET['a']; }  
    submitFunc::$a++; echo "\n a = ".submitFunc::$a;

    $_GET['a']=submitFunc::$a;}
    }if ($_GET['act'] == "subok"){
     $monitor = new submitFunc();
     $monitor->testFunc();
     $monitor->testFunc();
     $monitor->testFunc();
    }?>
    <form name="form1" method="post" action="oop.php?act=subok&a=<?php echo $_GET['a'];?>">
    <input type="submit" value="提交">
    </form>
      

  9.   

    原12L,对之前补充:12L贴出来的方法是最简单的更改,只是利用了GET,无需memcache以及其他的扩展资源,如果存储内容过大,为了满足转移的效果,还是推荐memcache的:)