【问题标题】:Surely a foolish error, but I can't see it当然是一个愚蠢的错误,但我看不到它
【发布时间】:2010-04-21 15:06:57
【问题描述】:

我有一个表格(大大简化了):

<form action='http://example.com/' method='post' name='event_form'>
  <input type='text' name='foo' value='3'/>
  <input type='submit' name='event_submit' value='Edit'/>
</form>

我有一个类“EventForm”来处理表单。主要方法 process() 如下所示:

public function process($submitname=false){
    $success=false;
    if ($submitname && isset($_POST[$submitname])){ //PROBLEM:  isset($_POST[$submitname] is always FALSE for some reason
        if($success=$this->ruler->validate()){//check that dependancies are honoured and data types are correct
            if($success=$this->map_fields()){//divide input data into Event, Schedule_Element and Temporal_Expression(s)
                $success=$this->eventholder->save();
            }
        }
    } else {//get the record from the db based on event_id or schedule_element_id
        foreach($this->gets as $var){//list of acceptable $_GET keys
            if(isset($_GET[$var])){
                if($success= $this->__set($var,$_GET[$var])) break;
            }
        }
    }
    $this->action=(empty($this->eventholder->event_id))? ADD : EDIT;
    return $success;
}

提交表单时,会发生这种情况:$form-&gt;process('event_submit'); 尽管出于某种原因,isset($_POST['event_submit']) 总是评估为 FALSE。有谁知道为什么?

ETA:在完成建议后,JQuery.validate() 似乎对表单提交产生了意想不到的影响。除提交按钮外,所有字段均已提交。这似乎是这个 JQuery 的错:

$("form[name='event_form']").validate({
    submitHandler: function(form) {
        form.submit();
    }
}};

关于如何确保提交按钮值被发送的任何想法?

【问题讨论】:

  • 这个例子有多简单?如果您使用 JavaScript 和 submit() 方法提交表单,那么任何提交按钮都不会被激活,因此不会是成功的控件,因此不会显示在表单数据中。
  • 您确定 $submitname 输入正确并且与您的提交按钮的名称相对应吗?
  • 你确定'event_submit' 被传递给$form-&gt;process()
  • @David Dorward:我认为这可能指向这个问题。我在提交时使用 JQuery.validate()。但我没有阻止标准提交操作。我的理解是 onSubmit 操作执行了 javascript,然后,除非被阻止,否则继续执行正常的表单操作。没有?
  • @Ilya Biruykov, @ax: event_submit 绝对是按钮的名称(经过多次验证,因为这也是我的第一个想法)。还验证了该方法接收按钮名称。

标签: php html forms syntax jquery-validate


【解决方案1】:

将您的 JQuery 更改为:

$("form[name='event_form']").validate({
    submitHandler: function(form) {
        $("form[name='event_form'] input[name='event_submit']").click()
    }
}};

【讨论】:

    【解决方案2】:

    在 $_POST 数组上执行 print_r 并查看提交的内容 - 它应该输出整个数组,例如

     print_r($_POST);
    

    【讨论】:

    • 好的,发生了非常奇怪的事情。表单最初通过 JQuery.validate() 进行验证,然后提交。当我在不考虑标题的情况下输出 $_POST 时,它关闭了 JQuery(预期),并且我的提交按钮有一个值。然后,当我将print_r($_POST) 移动到不会搞砸JQuery 的某个地方时,提交按钮仍然有一个值,即使之前我从那个位置执行print_r($_POST) 时,我什么也没得到。也许是 JQuery 和缓存的一些奇怪组合导致了问题?
    • @thetaiko:我同意。我有。但我没有得到我应该得到的。然后我将print_r($_POST) 移动到代码中的不同位置并得到了预期。然后我恢复了,仍然得到了预期。
    • @dnagirl - 检查脚本顶部的$_POST。如果它在那里,那么脚本中的其他内容正在更改该值。如果不是,那就是 JQuery 的问题。
    • @thetaiko:验证了 JQuery 是罪魁祸首。我已将 JQuery 问题区域添加到 OP
    【解决方案3】:

    我将你的代码分解成一个更简单的 PHP 文件:

    <?php
    function process($submitname=false){
    echo 'erg<br>';
      $success=false;
      if ($submitname && isset($_POST[$submitname])){ //PROBLEM:  isset($_POST[$submitname] is always FALSE for some reason
        echo 'bwah';
      }
    }
    
    process("event_submit");
    ?>
    
    <form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post" name="event_form">
      <input type="text" name="foo"/>
      <input type="submit" name="event_submit" value="Edit"/>
    </form>
    

    “erg”和“bwah”按预期显示。确保您的类被正确实例化,您实际上是在将“event_submit”传递给它,并且在您有机会阅读它之前,其他一些代码没有清除 $_POST。

    【讨论】:

    • @Sam Bisbee:所有这些都已验证。看来我与提交之前发生的一些 JQuery 验证有冲突。它不会影响任何其他表单字段,只会影响提交按钮。
    • “并且在你有机会阅读它之前,其他一些代码不会清除 $_POST”也是我的一个选择。一些框架(例如 Zend)在将超全局变量包装到它们自己的访问类中后将其置空,例如如果你使用 Zend 的 HTTP 请求对象,你不能检查$_POST$_GET 等等。 // 编辑:忍者。没关系。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-14
    • 2018-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多