Это меня раздражало, и я не могу понять, как обойти это. Скажем, у меня есть 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;
В моей включенной функции у меня есть другая форма, которая вызывает другое условие внутри функции.
---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" }
Я искал здесь и почти везде, где ответ на этот вопрос не имеет смысла, поэтому мой вопрос заключается в том, почему ничего из условий не работает? Мне это кажется очень странным, поэтому я собрал это вместе, чтобы проверить.
Вопрос не изменился, см. Ниже, поскольку то, что я должен показать, не соответствует комментариям.
Если я в 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>
Таким образом, вопрос остается тем же. Почему это не работает?
Это просто чистая логика - будет намного яснее, если вы создадите свои формы method="GET"
вместо POST.
Когда вы загружаете его вначале, вы нажимаете кнопку с именем "test", поэтому при загрузке в следующий раз вы получаете значение $ _POST ['test'].
Ваш код выглядит так: index.php:
if (isset($_POST['test'])) {
test();
}
поэтому, конечно, вызывается test(), и вы видите свой HTML из dostuff.php.
Кнопка в dostuff.php называется "dostuff", поэтому, когда вы нажимаете эту кнопку, форма снова загружается со значением в $ _POST ['dostuff'] '' НО НО ЗНАЧЕНИЕ В $_POST['test']
!! ''
Еще раз ваша логика в верхней части index.php такова:
if (isset($_POST['test'])) {
test();
}
и поскольку в $ _POST ['test'] нет значения, ваша функция test()
никогда не будет вызвана, и вы никогда не увидите кнопку, которую вы ожидаете.
На самом деле - измените свои формы на GET
(вам придется использовать $ _GET или $ _REQUEST вместо $ _POST), чтобы вы могли точно видеть, что задается каждый раз, не прибегая к просмотру всех фантазийных файлов, и я думаю, что это будет быть действительно ясным.
exit()
после функцииtest()