Php和形式问题

时间:2011-06-10 05:47:12

标签: php forms

这是我的超简化index.php:

<?php
    require_once 'DeleteOrAdd.php';  // handles adding/deleting a db record


    doAddDeleteRecord();
    // other functions are called here, left out though for brevity
 ?>

这是DeleteOrAdd.php(简化)

<?php
    function doAddDeleteRecord()
    {
         echo <<<_END
             <form action="index.php" method="post">

                // the other form html not shown here

             <input type="submit" value="ADD RECORD" />
             </form>
_END;        

     // NOT SHOWN -- code to handle the form when it is POST'd

    }
 ?>

所以现在晚上10:30,我是PHP的新手,好的/借口。 无法弄清楚如何做到这一点。

我想将上面的form action="index.php"更改为form action="DeleteOrAdd.php" (即我想重新发布到此表单所在的文件中, 到index.php,所以代码更清晰)。 但它不起作用,因为我有POST的所有表单处理逻辑 - 在doAddDeleteRecord()函数中,如果我设置表单action="DeleteOrAdd.php" 它不会起作用。

是否可以执行form action="DeleteOrAdd.php:doAddDeleteRecord()

之类的操作

我不想把它放在课堂上。 我也希望保持我的index.php就像它上面一样 - 调用函数而不是主要的 超出该范围的内联代码。

有什么想法吗?

最初,所有代码都在index.php中内联(从PHP书的样本中获取) 然后我将代码划分为Netbeans项目中的逻辑命名的PHP文件 清理它,并将东西放在从index.php调用的函数中。

4 个答案:

答案 0 :(得分:2)

从表单中完全删除操作值,默认情况下,它会始终返回到显示它的网址。

<form action="" method="POST">

答案 1 :(得分:1)

您的申请结构不合理。我建议遵循MVC模式。

但是对于你当前的问题,你可以做这样的事情

只需将操作设置为<form action="DeleteOrAdd.php",或者您可以将操作完全留空,然后将数据发布到创建表单的同一文件中。

发布表单后,您可以在DeleteOrAdd.php文件中执行此操作。

if (isset($_POST['submit']))
{
  doAddDeleteRecord();// this will call your 
}

但在这种情况下,您可能需要更改index.php

的代码

答案 2 :(得分:1)

我认为你在这里遇到的问题是能够让你的PHP页面分辨出它是否是一个新的负载或者是否提交了表单,这就是为什么你将索引页面合并到你的action参数中的原因。但是,这不是必要的。

将提交元素的ID和名称(有效标记)属性设置为唯一名称。例如“form_submit”所以这里是一个例子。

<form action="" method="post">

<input type="submit" id="form_submit" name="form_submit" value="ADD RECORD" />

</form>

那么你在PHP脚本中添加的内容(doAddorDelete.php)就是这个......

 if (array_key_exists('form_submit', $_POST)) {

    //this is the code to execute on form submit
    //use print_r($_POST) to view variables you can use here
    //make sure you validate all data passed here especially if using a database
    //ie if MySQL
    //$validated_userinput = mysql_real_escape_string(strip_tags(htmlentities(trim($_POST['userinput']))), $link_resource); for text
    //(int) $_POST['userinput'];  for numbers


    } else {
         echo <<<_END
                 <form action="" method="post">

                    // the other form html not shown here

                 <input type="submit" id="form_submit" name="form_submit" value="ADD RECORD" />
                 </form>
    _END;
    }

希望这有帮助! :)

答案 3 :(得分:0)

前言:既然你说这是一个学习练习,我将跳过关于最佳实践和OOP的许多和各种美德的道貌岸然的宣言。 ;)你的书可能详述了我通常会在这样的解决方案中提出的每一个可怕的警告/严厉讲座。

  

是否可以做类似的事情   形成   行动=“DeleteOrAdd.php:doAddDeleteRecord()   ?

简而言之,是的。实现目标的最简单方法是在表单操作中引用您的文件,如下所示:

<!-- form.php -->
<form action="DeleteOrAdd.php" method="POST">

然后在DeleteOrAdd.php中,通过测试表单提交将发送的$ _POST数据来触发您的函数,如下所示:

<?php
// DeleteOrAdd.php

if(isset($_POST['some_form_variable']) && $_POST['some_form_variable'] != null) {
    $data = array();
    foreach($_POST as $post) {
        array_push($data, $post);
    }
    doAddDeleteRecord($data);
}

function doAddDeleteRecord($data) { 
     // ...your processing code, etc.

你所指定的纯粹程序性方法的结果是坦率地说,你可以做这样的事情。你不想在现实生活中这样发展(跳过这个 - 潜水,我保证你的书解释了为什么不详尽。)

重要说明!! 由于我在您发布的代码段中没有看到返回值,并且您说您刚刚开始,我会花一分钟时间点在这里隐藏陷阱以防万一:

- &GT;您的代码可能与我在函数上面添加的六行完美匹配,如果您不是

,您将永远不会知道它
  1. 返回一个值(证明代码运行,如果没有别的话)和
  2. 捕获所述值,以便您可以对其进行操作/显示/以其他方式向您展示

    一个。事情发生了 - 理想情况下, 湾那是什么东西。

  3. 否则,你所得到的只是含糊不清:没有任何迹象表明它正在工作或破坏(不抛出错误,警告等)。令人沮丧的调试,至少可以说。

    所以,那说明 - 假设你的函数返回了某些东西(成功时是真的,带有消息的字符串,无论如何)它可能是这样的:

    function doAddDeleteRecord($data) {
        // ... your function code, etc.
        $sql = "INSERT INTO mytable VALUES(".implode(',',$data).")";
        if (mysql_query($sql) == true) { 
            $message = "Record saved";
        } else {
            $message = false;
        }
        return $message;
    }
    

    您的函数返回的任何值都需要一个变量来捕获它,否则它将不会被设置。调用doAddDeleteRecord()函数时,使用变量赋值捕获它:

     ... // same 6 little lines of conditional code ...
        }
        $result = doAddDeleteRecord($data);
     }
     // maybe just echo it out or something...
     echo $result;
    

    - 或 -

      ... // still the same 6 lines ...
         }
         $result = doAddDeleteRecord($data);
      }
      // maybe have a new test based on the outcome of the last one...
      if ($result == false) { 
          // do something about the fail...
      } elseif (is_string($result)) {
          // do something about the success...
      }
    
    祝你好运,HTH。 :)