外部功能的条件不起作用

时间:2015-03-24 21:11:42

标签: php forms function conditional external

这一直困扰着我,我似乎无法弄清楚如何解决这个问题。假设我有一个index.php,其中包含另一个页面dostuff.php,这只是一个很大的功能。在我的索引页面上,我有一个条件,可以通过表单中的按钮调用:

--- ---的index.php

<?php
include 'dostuff.php';

if (isset($_POST['test'])) {
    test();
}

echo '<form id="test" method="post" action="'.htmlentities($_SERVER['PHP_SELF']).'">'.PHP_EOL;
echo '<button name="test" form="test" type="submit" value="test">Test</button>'.PHP_EOL;
echo '</form>'.PHP_EOL;

在我的include函数中,我有另一个在函数中调用另一个条件的形式。

--- --- dostuff.php

<?php
function test() {
    if (isset($_POST['dostuff'])) {
        echo '<h1>Testing Do Stuff.</h1>';
    }

    echo '<form id="dostuff" method="post" action="'.htmlentities($_SERVER['PHP_SELF']).'">'.PHP_EOL;
    echo '<button name="dostuff" form="dostuff" type="submit" value="dostuff">Do Stuff!</button>'.PHP_EOL;
    echo '</form>'.PHP_EOL;
}

当我单击索引页面上的按钮时,将调用include并使用其表单填充页面。但是,当我单击该函数中的按钮时,表单将消失,条件永远不会执行。

现在,如果我将以下内容添加到索引页面:

print "CONTENT_TYPE: " . $_SERVER['CONTENT_TYPE'] . "<br>";
$data = readfile('php://input');
$contents = file_get_contents('php://input');
print "<br>";
print "DATA: <pre>";
var_dump($contents);
var_dump($data);
var_dump($_POST);
print "</pre>";

显然,var_dump调用验证了表单按钮的调用,但条件从不执行。

CONTENT_TYPE: application/x-www-form-urlencoded
dostuff=dostuff
DATA:

string(15) "dostuff=dostuff"
int(15)
array(1) {
  ["dostuff"]=>
  string(7) "dostuff"
}

我在这里搜索了几乎所有其他地方的答案都无济于事,所以我的问题是为什么条件码内的任何内容都有效?这对我来说似乎很奇怪所以我把它拼凑在一起测试。

2 个答案:

答案 0 :(得分:0)

它只是纯粹的逻辑 - 如果您使表单使用method="GET"而不是POST,它会更加清晰。

当你在开头加载它时,你点击名为&#34的按钮;测试&#34;所以当你下次加载时你有一个$ _POST [&#39; test&#39;]值。

你的代码在index.php中是这样的:

if (isset($_POST['test'])) {
    test();
}

所以当然调用了test(),你可以从dostuff.php看到你的HTML。

dostuff.php中的按钮名为&#34; dostuff&#34;因此,当您按下该按钮时,表单会再次加载$ _POST中的值[&#39; dostuff&#39;]&#39;&#39;但$_POST['test']中没有值!!&#39; &#39;

index.php顶部的逻辑再次是这样的:

if (isset($_POST['test'])) {
    test();
}

由于$ _POST [&#39; test&#39;]没有任何价值,您的test()函数永远不会被调用,您永远不会看到您期望的按钮。

真的 - 将您的表单更改为GET(您必须使用$ _GET或$ _REQUEST而不是$ _POST),这样您就可以确切地看到每次设置的内容而无需诉诸所有花哨的文件阅读,我认为它会非常清楚。

答案 1 :(得分:0)

问题没有改变,请参阅下文,因为我要展示的内容不符合评论。

如果我在index.php中并查看我的来源,我会得到这个:

<form id="test" method="get" action="/test/index.php">
    <button name="test" form="test" type="submit" value="test">Test</button>
</form>

如果我点击测试,我现在得到:

<form id="dostuff" method="get" action="/test/index.php">
    <button name="dostuff" form="dostuff" type="submit" value="dostuff">Do Stuff!</button>
</form>
<form id="test" method="get" action="/test/index.php">
    <button name="test" form="test" type="submit" value="test">Test</button>
</form>

如果我使用条件来调用我的函数,我什么也得不回来。如果我消除index.php上的条件,只需调用test();我回来了:

<form id="dostuff" method="get" action="/test/index.php">
    <button name="dostuff" form="dostuff" type="submit" value="dostuff">Do Stuff!</button>
</form>
<form id="test" method="get" action="/test/index.php">
    <button name="test" form="test" type="submit" value="test">Test</button>
</form>

现在,如果我点击“Do Stuff!”我回来了:

<h1>Testing Do Stuff.</h1>
<form id="dostuff" method="get" action="/test/index.php">
    <button name="dostuff" form="dostuff" type="submit" value="dostuff">Do Stuff!</button>
</form>
<form id="test" method="get" action="/test/index.php">
    <button name="test" form="test" type="submit" value="test">Test</button>
</form>

所以,问题仍然存在。为什么这不起作用?