$_POST值在<形式动作=“;javascript:someJSFunction()"/>

$_POST value not set when <form action="javascript:someJSFunction()" ... />

本文关键字:javascript someJSFunction gt quot 值在 POST lt      更新时间:2024-03-11

基本问题:$_POST和$_GET变量具体何时设置?我提出这个问题的原因解释如下。

提前披露:我在这里分享的文件是为了测试/学习目的,并不旨在实现任何有用的目标。我写这篇文章是为了将这个问题与我正在进行的项目的其他细节隔离开来

以下是我尝试做的事情的摘要:我从表单调用一个javascript函数

<form action="javascript:jsTest()" ... />

然后在jsTest()中,我根据php函数phpTest()的返回分配一个javascript变量:

var jsVar = <?php echo json_encode(phpTest()); ?>;

函数phpTest()只是返回一个$_POST变量:

return $_POST['testName'];

这是完整的代码:

<?php
session_start();
function phpTest() {
    return $_POST['testName'];
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8" />
    <title>javascript/php test</title>
    <script type="text/javascript">
        function jsTest() {
            var jsVar = <?php echo json_encode(phpTest()); ?>;
            alert(jsVar);
        }
    </script>
</head>
<body>
    <form method="POST" name="testForm" action="javascript:jsTest()">
        <input type="text" name="testName" value="username" />
        <input type="submit" value="submit" />
    </form>
</body>
</html>

问题:警报始终显示null

我用两种方法对此进行了测试。1) 如果我将表单操作设置为一个单独的.php文件,则会设置与表单输入字段关联的$_POST变量,并且浏览器中会显示该文件中这些$_POST值的回声。或者,2)如果我从phpTest()返回一个简单的字符串

return 'hello kitty';

然后javascript alert()会准确地显示返回的字符串。因此,我认为可以安全地假设$_POST变量尚未设置。这就引出了一个我一直无法找到答案的问题:

$_POST变量究竟何时设置?我假设它是在页面重新加载之前(这是我的方法所要求的),我假设这一点是因为如果我在代码中使用method="GET",我会看到GET变量被附加到URL上,而之前没有任何页面重新加载。

提前谢谢。

Chris

正如Marc B在您当前的代码示例中所说,它永远不会像您想要的那样工作。

$_POST在整个脚本中都是可用的,因为它是PHP的超全局数组之一,但它可能没有值。当通过HTTP POST请求发送POSTDATA时,$_POST具有值。您可以通过程序设置$_POST的值,但这并不酷。曾经

为了让脚本工作(ish),您需要发送一个填充了一些POSTDATA的HTTPPOST请求。您可以使用cURL或Firefox的Poster插件来完成此操作。

POST /index.php HTTP/1.1
User-Agent: curl/7.21.4 (universal-apple-darwin11.0)
Host: example.org
Accept: */*
Content-Length: 16
Content-Type: application/x-www-form-urlencoded
testName=yeahboi

如果您可以查看HTTP响应主体,那么JavaScript变量JsVar现在应该填充"yeahboi"。

我更新了你的脚本一点,通过HTTPPOST将表单提交给它自己,并填充一个JavaScript变量。

<?php
// Script name: index.php
// Define a default value...
$name = 'unknown';
// Make sure post item 'testName' is available...
if(isset($_POST['testName']) &&
    !empty($_POST['testName'])) {
    // POST is available update name...
    $name = $_POST['testName'];
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8" />
    <title>javascript/php test</title>
    <script>
    // wait for the DOM to be ready then update the JS variable with PHP's $name variable
    document.addEventListener('DOMContentLoaded', function() {
        var elm = document.getElementById('post-response'),
            value = '<?php echo $name; ?>';
        elm.innerHTML = value;
    }, false);
    </script>
</head>
<body>
    <div id="post-response"></div>
    <form method="POST" name="testForm" action="index.php">
        <input type="text" name="testName" value="username" />
        <input type="submit" value="submit" />
    </form>
</body>
</html>

希望这能帮你一点忙。