从同一文件中的 HTML 表单调用 PHP 函数

Posted

技术标签:

【中文标题】从同一文件中的 HTML 表单调用 PHP 函数【英文标题】:Calling a PHP function from an HTML form in the same file 【发布时间】: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 执行请求客户端。 【参考方案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 调用。

【讨论】:

那么如何让它变成另一种方式呢?什么时候点击了按钮?

以上是关于从同一文件中的 HTML 表单调用 PHP 函数的主要内容,如果未能解决你的问题,请参考以下文章

PHP中的表单怎么自定义按钮事件?怎么在调用?

从 PHP/HTML 表单更新 SQL

GNU gcc/ld - 使用在同一个目标文件中定义的调用者和被调用者包装对符号的调用

如何从 Django 中的表单调用 Python 函数?

PHP - 从另一个域中的外部文件调用 wordpress 函数

PHP 表单 - 提交时停留在同一页面上