【问题标题】:Calling a PHP function from an HTML form in the same file从同一文件中的 HTML 表单调用 PHP 函数
【发布时间】:2011-08-23 11:09:10
【问题描述】:

我试图在用户输入文本并按下提交按钮后在同一页面中执行 PHP 函数。

我首先想到的是使用表单。当用户提交表单时,PHP 函数将在同一页面中执行。用户不会被定向到另一个页面。处理将完成并显示在同一页面中(无需重新加载)。

这是我的目标:

test.php 文件中:

<form action="test.php" method="post">
    <input type="text" name="user" placeholder="enter a text" />
    <input type="submit" value="submit" onclick="test()" />
</form>

PHP 代码 [test() 函数]在同一个文件中

<?php
    function test() {
        echo $_POST["user"]; // Just an example of processing
    }
?>

但是,我仍然遇到问题!有人有想法吗?

【问题讨论】:

  • onclick= 调用 Javascript 函数。这可能是您应该在这里使用的。
  • 我的处理不仅仅是回显文本。它不能使用 Javascript 执行。它需要 PHP
  • 我认为您需要更多地了解客户端和服务器端语言。如果您需要在不刷新的情况下执行此操作,您将使用客户端语言(例如 javascript)实现它或使用 AJAX 执行请求客户端。

标签: php html forms post


【解决方案1】:

您可以在不刷新页面的情况下提交表单,但据我所知,如果不对服务器上的 PHP 脚本使用 JavaScript/Ajax 调用,这是不可能的。以下示例使用jQuery JavaScript library

HTML

<form method = 'post' action = '' id = 'theForm'>
...
</form>

JavaScript

$(function() {
    $("#theForm").submit(function() {
        var data = "a=5&b=6&c=7";
        $.ajax({
            url: "path/to/php/file.php",
            data: data,
            success: function(html) {
                .. anything you want to do upon success here ..
                alert(html); // alert the output from the PHP Script
            }
        });
        return false;
    });
});

提交后,将调用匿名 Javascript 函数,该函数只是向您的 PHP 文件发送请求(顺便说一句,该文件需要在 单独的文件中)。上面的data 需要是一个 URL 编码的查询字符串,您希望将它发送到 PHP 文件(基本上是表单字段的所有当前值)。这些将在$_GET 超级全局中出现在您的服务器端 PHP 脚本中。下面是一个例子。

var data = "a=5&b=6&c=7";

如果那是您的数据字符串,那么 PHP 脚本将显示为:

echo($_GET['a']); // 5
echo($_GET['b']); // 6
echo($_GET['c']); // 7

但是,您需要从表单字段中构造数据,因为它们存在于您的表单中,例如:

var data = "user=" + $("#user").val();

(您需要用'id'标记每个表单字段,上面的id是'user'。)

PHP 脚本运行后,success 函数被调用,PHP 脚本产生的所有输出都将存储在变量html 中。

...
success: function(html) {
    alert(html);
}
...

【讨论】:

    【解决方案2】:

    如果不重新加载,仅使用 HTML 和 PHP 是不可能的,但这可能与您想要的非常相似,但您必须重新加载:

    <?php
        function test() {
            echo $_POST["user"];
        }
    
        if (isset($_POST[])) { // If it is the first time, it does nothing
            test();
        }
    ?>
    
    <form action="test.php" method="post">
        <input type="text" name="user" placeholder="enter a text" />
        <input type="submit" value="submit" onclick="test()" />
    </form>
    

    【讨论】:

      【解决方案3】:

      这不能以您所说的方式完成。 PHP 是服务器端,而表单 存在于客户端。如果您不想刷新页面,则需要考虑使用 JavaScript 和/或 Ajax。

      test.php

      <form action="javascript:void(0);" method="post">
          <input type="text" name="user" placeholder="enter a text" />
          <input type="submit" value="submit" />
      </form>
      
      <script type="text/javascript">
          $("form").submit(function(){
              var str = $(this).serialize();
              $.ajax('getResult.php', str, function(result){
                  alert(result); // The result variable will contain any text echoed by getResult.php
              }
              return(false);
          });
      </script>
      

      它将调用getResult.php 并将序列化的表单传递给它,以便PHP 可以读取这些值。任何getResult.php 回显都将返回到result 变量中的JavaScript 函数,返回test.php 并(在这种情况下)显示在警告框中。

      getResult.php

      <?php
          echo "The name you typed is: " . $_REQUEST['user'];
      ?>
      

      注意

      此示例使用第三方 JavaScript 包装器 jQuery。我建议您先更好地了解这些网络技术如何协同工作,然后再让自己进一步复杂化。

      【讨论】:

      • 我需要执行一个 PHP 代码。而且,我不需要刷新页面。 Javascript 和/或 AJAX 是否提供此功能?
      • 您应该在回答中指出您的示例使用了 jQuery(这可能不是一个好主意,应该先掌握有关 Web 的基本知识)。
      【解决方案4】:

      这是我用来创建提交而不加载表单的更好方法。

      您可以使用一些 CSS 以您想要的方式设置 iframe 的样式。

      一个 php 结果将被加载到 iframe 中。

      <form method="post" action="test.php" target="view">
        <input type="text" name="anyname" palceholder="Enter your name"/>
        <input type="submit" name="submit" value="submit"/>
        </form>
      <iframe name="view" frameborder="0" style="width:100%">
        </iframe>
      

      【讨论】:

        【解决方案5】:

        看看这个例子:

        <!DOCTYPE HTML> 
        <html>
        <head>
        </head>
        <body> 
        
        <?php
        // define variables and set to empty values
        $name = $email = $gender = $comment = $website = "";
        
        if ($_SERVER["REQUEST_METHOD"] == "POST") {
           $name = test_input($_POST["name"]);
           $email = test_input($_POST["email"]);
           $website = test_input($_POST["website"]);
           $comment = test_input($_POST["comment"]);
           $gender = test_input($_POST["gender"]);
        }
        
        function test_input($data) {
           $data = trim($data);
           $data = stripslashes($data);
           $data = htmlspecialchars($data);
           return $data;
        }
        ?>
        
        <h2>PHP Form Validation Example</h2>
        <form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>"> 
           Name: <input type="text" name="name">
           <br><br>
           E-mail: <input type="text" name="email">
           <br><br>
           Website: <input type="text" name="website">
           <br><br>
           Comment: <textarea name="comment" rows="5" cols="40"></textarea>
           <br><br>
           Gender:
           <input type="radio" name="gender" value="female">Female
           <input type="radio" name="gender" value="male">Male
           <br><br>
           <input type="submit" name="submit" value="Submit"> 
        </form>
        
        <?php
        echo "<h2>Your Input:</h2>";
        echo $name;
        echo "<br>";
        echo $email;
        echo "<br>";
        echo $website;
        echo "<br>";
        echo $comment;
        echo "<br>";
        echo $gender;
        ?>
        
        </body>
        </html>
        

        【讨论】:

          【解决方案6】:

          如果您不想使用 Ajax 并希望您的页面重新加载。

          <?php
          if(isset($_POST['user']) {
          echo $_POST["user"]; //just an example of processing
          }    
          ?>
          

          【讨论】:

            【解决方案7】:

            使用SAJAX 或切换到 JavaScript

            Sajax 是一个开源工具 使用 Ajax 编程网站 框架——也称为 XMLHTTPRequest 或远程脚本—— 尽可能简单。萨贾克斯做到了 易于调用 PHP、Perl 或 Python 您的网页中的功能通过 JavaScript 不执行 浏览器刷新。

            【讨论】:

            • 我需要比这更简单的东西。看起来好复杂!
            • @2rk 嗯,网络编程是一种职业,而不是像“嘿,让我们建立一个网站”这样简单的事情。如果你想创建网站,首先你必须学习如何去做。然后每天学习和学习新的东西。
            • jQuery 更简单,新手也能轻松上手。
            【解决方案8】:

            这是一个完整的 php 脚本,可以执行您所描述的操作,尽管毫无意义。您需要阅读服务器端与客户端。 PHP 不能在客户端运行,你必须使用 javascript 与服务器交互,或者忍受页面刷新。如果您无法理解这一点,您将无法使用我的代码(或其他任何人的代码)为您谋取利益。

            以下代码在没有 jQuery 的情况下执行 AJAX 调用,并调用相同的脚本将 XML 流式传输到 AJAX。然后它会在用户框下方的 div 中插入您的用户名和 &lt;br/&gt;

            在尝试像 AJAX 这样高级的东西之前,请先学习基础知识。你最终只会让自己感到困惑,并可能浪费别人的钱。

            <?php
                function test() {
                    header("Content-Type: text/xml");
                    echo "<?xml version=\"1.0\" standalone=\"yes\"?><user>".$_GET["user"]."</user>"; //output an xml document.
                }
                if(isset($_GET["user"])){
                    test();
                } else {
            ?><html>
                <head>
                    <title>Test</title>
                    <script type="text/javascript">
                        function do_ajax() {
                            if(window.XMLHttpRequest){
                                xmlhttp=new XMLHttpRequest();
                            } else {
                                xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
                            }
                            xmlhttp.onreadystatechange = function(){
                                if (xmlhttp.readyState==4 && xmlhttp.status==200)
                                {
                                    var xmlDoc = xmlhttp.responseXML;
                                    data=xmlDoc.getElementsByTagName("user")[0].childNodes[0].nodeValue;
                                    mydiv = document.getElementById("Test");
                                    mydiv.appendChild(document.createTextNode(data));
                                    mydiv.appendChild(document.createElement("br"));
                                }
                            }
                            xmlhttp.open("GET","<?php echo $_SERVER["PHP_SELF"]; ?>?user="+document.getElementById('username').value,true);
                            xmlhttp.send();
                        }
                    </script>
                </head>
                <body>
                    <form action="test.php" method="post">
                        <input type="text" name="user" placeholder="enter a text" id="username"/>
                        <input type="button" value="submit" onclick="do_ajax()" />
                    </form>
                    <div id="Test"></div>
                </body>
            </html><?php } ?>
            

            【讨论】:

              【解决方案9】:

              您对网络的运作方式有很大的误解。

              基本上,事情是这样发生的:

              • 用户(嗯,浏览器)从您的服务器请求test.php
              • 在服务器上,test.php 运行,内部的所有内容都被执行,生成的 HTML 页面(包括您的表单)将被发送回浏览器
              • 浏览器显示表单,用户可以与之交互。
              • 用户提交表单(到action中定义的URL,在这种情况下是同一个文件),所以一切都从头开始(除了表单中的数据也会被发送)。对服务器的新请求,PHP 运行等。这意味着页面将被刷新。

              您试图从您的onclick 属性调用test()。此技术用于运行 客户端 脚本,在大多数情况下为 Javascript(代码将在用户的浏览器上运行)。这与 PHP 无关,它是 server-side,驻留在您的服务器上,只有在请求进入时才会运行。请阅读 Client-side Versus Server-side Coding 例如。

              如果你想在不刷新页面的情况下做某事,你必须使用 Javascript 在后台向服务器发送请求,让 PHP 做它需要做的事情,并从它那里接收答案。这种技术基本上称为 AJAX,您可以使用 Google 找到很多关于它的优秀资源(例如 Mozilla's amazing tutorial)。

              【讨论】:

                【解决方案10】:

                这就是 PHP 的工作方式。 test() 将在页面加载时执行,而不是在单击提交按钮时执行。

                要执行此类操作,您必须让 onclick 属性对 PHP 文件执行 AJAX 调用。

                【讨论】:

                • 那么如何让它变成另一种方式呢?什么时候点击了按钮?
                猜你喜欢
                • 2016-05-18
                • 1970-01-01
                • 2018-09-21
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多