1

我正在处理一个表单,我想根据表单提交的输入值更改表单操作。这需要使用 PHP 来完成。

这是我到目前为止所尝试的:

<?php
    $action = "";
    $input = (isset($_POST["hp"])); 
    if($input == "") {
      $action = "action1"; 
    } else {
      $action = "action2"; 
    }   
?>
<form name="contactForm" id="contactForm" method="post" action="<?php echo $action; ?>">

    <!-- form stuff here -->

    <input id="hp" name="hp" type="text" class="hp"/>
    <input type="submit" name="submit" id="submit" value="Submit Query" class="button" />
</form>

这不起作用,因为hp字段 for(isset($_POST["hp"]))从一开始就没有值,所以它总是转到 action1。

我也试过:

<?php   
  if(isset($_POST['submit'])){ 
    $input = ($_POST['hp']); 
    $action = "";
    if($input == "") {
      $action = "action1";
    } else {
      $action = "action2";
    }
  }    
?>
<form name="contactForm" id="contactForm" method="post" action="<?php echo $action; ?>">

这不起作用,因为 Perch(正在构建的 CMS)会抛出一个$action尚未定义的错误。

当我尝试时:

<?php   
  $action = "";
  if(isset($_POST['submit'])){ 
    $input = ($_POST['hp']); 
    if($input == "") {
      $action = "action1";
    } else {
      $action = "action2";
    }
  }    
?>

它在提交时根本没有做任何事情,因为它将操作设置为“”。

有什么建议么?

4

4 回答 4

4

简写

$action = isset($_POST['hp'])?'action2':'action1';

就这样。

于 2017-04-17T18:26:07.443 回答
1

不同的可能性:

相同的动作和重定向

最简单的方法可能是将表单发送到同一个 PHP 文件,在这个文件中,通过 POST 获取这个输入的内容并重定向到正确的文件。

防止默认提交并通过 JavaScript 添加提交事件

第二个选项,可以在通过 JavaScript 提交时向表单添加事件,阻止默认操作以阻止提交,然后检查输入值,设置操作并提交表单:

<form name="contactForm" id="contactForm" method="post" action="">
    ...
</form>

<script>
    document.querySelector('#contactForm').addEventListener('submit', function(e) {
        //Prevent default submit
        e.preventDefault();

        //Check input value
        if (...) {
            this.action = "page1.php";
        } else if (...) {
            this.action = "page1.php";
        }

        //perform submit form.
        this.submit();
    });
</script>

使用数据绑定库

这可能是最好的形式,但最难理解的是,这种形式是基于使用数据绑定库,如 Vue.js、KnockoutJS 或 RactiveJS 来根据输入值在模型对象中设置动作字符串。

然后,在 HTML 表单标签中,使用所选库的绑定语法设置模型数据的值:

//Vue.js syntax
<form name="contactForm" id="contactForm" method="post" :action="action">

//Ractive.js syntax
<form name="contactForm" id="contactForm" method="post" action="{{action}}">

我有什么建议?

如果您对 PHP 很陌生并且不知道 JavaScript,那么第一个选项可能最适合您,如果您知道 JavaScript 并且知道如何处理事件,但从未使用过绑定库,则可能是第二个选项更推荐给你。

如果您使用某些数据绑定库(或实现数据绑定的框架,如 Angular),第三种选择可能最适合您。

于 2017-04-17T18:38:55.187 回答
0

上面的答案都不适合我,所以这就是我最终的结果。

用例:

  1. 我有一个包含两个字段的“搜索”表单。当用户单击“搜索”时,应将这些值添加到 URL,以便可以为以前的搜索添加书签。然后应该执行搜索。
  2. 首次加载页面或未使用搜索条件时,应显示所有可能的结果。

代码说明:

  • 在文件顶部,检查用户是否提交了表单。如果是这样:
    • 从您想要的字段中获取值并将它们保存到局部变量中。
    • 导航到同一个 PHP 文件,这次传递您感兴趣的变量
  • 如果用户没有提交表单:
    • 检查 URL 参数
    • 如果存在 URL 参数,请将它们保存到局部变量中,并使用这些局部变量来运行搜索

代码片段:

  if(isset($_POST['submit'])){
    if(!empty($_POST['projectNameSearch'])){
      $projectNameSearch = mysqli_real_escape_string($conn, $_POST['projectNameSearch']);
    }
    if(!empty($_POST['projectDescriptionSearch'])){
      $projectDescriptionSearch = mysqli_real_escape_string($conn, $_POST['projectDescriptionSearch']);
    }
    if($projectNameSearch != '' || $projectDescriptionSearch != ''){
      header("Location: projects.php?projectnamesearch=$projectNameSearch&projectdescriptionsearch=$projectDescriptionSearch");
    }
  } else {
    if(isset($_GET['projectnamesearch'])){
      $projectNameSearch = mysqli_real_escape_string($conn, $_GET['projectnamesearch']);
    }
    if(isset($_GET['projectdescriptionsearch'])){
      $projectDescriptionSearch = mysqli_real_escape_string($conn, $_GET['projectdescriptionsearch']);
    }
  }

于 2020-05-23T06:06:54.227 回答
0

如果第 2 版和第 3 版不起作用,则您必须缺少如下输入:

<input type="submit" name="submit">

您可以将该按钮添加到表单中,也可以更改代码以使用if isset($_POST['hp'])

<?php   
  $action = "";
  if(isset($_POST['hp'])){ 
    $input = ($_POST['hp']); 
    if($input == "") {
      $action = "action1";
    } else {
      $action = "action2";
    }
  }    
?>
于 2017-04-17T18:26:14.697 回答